2016-11-28 3 views
0

Ich arbeite mit Laravel Eloquent-Modellen und habe bei einem Erbschaftsproblem festgefahren.PHP Laravel Eltern erben dynamische statische Parameter von Kindern

Ich habe BaseModel Klasse, die protected static $dynamicRelations = []; Parameter hat, und einige Methoden, um damit zu arbeiten.

Und dann habe ich mehrere andere Klassen, erstreckt BaseModel, in diesem Beispiel die PageModel und EventModel sagen lassen.

Wenn ich eine dynamische Beziehung auf der Seite Modell zu erstellen, die als solche PageModel::setDynamicRelation, es setzt sie in der statischen Variablen:

public static function setDynamicRelation($key, $callback) 
    { 
     static::$dynamicRelations[$key] = $callback; 
    } 

Auf diese Weise habe ich eine dynamische Beziehung zum Modell hinzugefügt werden können. Wenn ich also PageModel::setDynamicRelation('banners', ...) mache, dann kann ich auf einer Instanz von PageModelPageModel->banners aufrufen, um die Beziehungswerte abzurufen.

Das Problem ist, dass die Beziehungen im statischen Parameter BaseModel gehalten werden und von anderen Modellen vererbt werden. Also, wenn ich die relationsip auf PageModel setzen und dann eine EventModel instanziieren, erhält es auch die gleichen Beziehungen, die nicht korrekt ist.

Wie kann ich es so machen, dass die Beziehungen in der Kindklasse gespeichert werden und nicht von anderen Klassen vererbt werden? I.e. müssen Sie eine Kopie von $dynamicRelations in der Klasse speichern, für die die Methoden aufgerufen werden, sodass nicht alle untergeordneten Elemente die gleichen Beziehungen haben?

Danke!

+0

, wenn Sie wollen etwas, das dynamische warum nicht morphen benutzen? – jycr753

+0

@ jycr753 könntest du bitte weiterlesen? Ich habe eine Struktur, in der ich Modulen erlauben muss, andere Module zu ändern, so dass ein Modul namens "PageBanners" eine dynamische Beziehung zum 'Page'-Modell hinzufügen kann, ohne den Code im' Page'-Modell zu ändern. – Giedrius

+0

Das sollte nicht passieren. In Ihrem Beispiel sollte 'EventModel' nicht die Beziehungen des' PageModel' erhalten, sie sind zwei verschiedene Instanzen. – user3158900

Antwort

1

Haben Sie Tests, die das zeigen?

So besagt Sie, dass Sie nicht wollen, Late Static Bindings

statische Eigenschaften auf Eltern-Klassen, die in untergeordneten Klassen definiert sind, propagieren nicht auf andere Kind-Instanzen, die das übergeordnete Modell erweitern. Zum Beispiel hat Illuminate\Database\Eloquent\Model die Eigenschaft protected static $globalScopes = [];, aber wenn Sie einen globalen Bereich zu einem Modell erweitern Model hinzufügen drückt es in diesem Array, genauso wie Sie mit Ihrem $dynamicRelationships Array tun, aber diese Instanzen werden nicht in den Klassen Model erweitert.

See Laravel's implementation of this here

+0

Ich dachte es gäbe eine elegantere Lösung, als die 'static :: class' als Array-Schlüssel zu verwenden, aber wenn das Framework dies tut, dann muss es gut genug sein. Vielen Dank dafür! – Giedrius

Verwandte Themen