2016-11-28 112 views
0

我正在使用Laravel Eloquent模型,並且陷入了繼承問題。PHP Laravel父母繼承兒童的動態靜態參數

我有BaseModel類,其中有protected static $dynamicRelations = [];參數,以及一些方法來處理。

然後我有多個其他類,擴展BaseModel,對於這個例子,我們假設PageModelEventModel

如果我創建頁面模型的動態關係,因此PageModel::setDynamicRelation,它把它在靜態變量:

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

這樣一來,我可以添加一個動態關係模型。所以如果我做PageModel::setDynamicRelation('banners', ...),那麼在PageModel的實例上,我可以調用PageModel->banners來檢索關係值。

問題是,關係保留在BaseModel靜態參數中,並由其他模型繼承。因此,如果我將關係ip設置爲PageModel,然後實例化一個EventModel,它也會得到相同的關係,這是不正確的。

我該如何使關係存儲在子類中而不被其他類繼承?即需要在方法被調用的類上存儲$dynamicRelations的副本,所以所有的孩子都不會共享相同的關係?

謝謝!

+0

,如果你想要的東西,動態爲什麼不使用變身? – jycr753

+0

@ jycr753請問您可以擴展一下嗎?我有一個結構,我需要允許模塊更改其他模塊,因此稱爲「PageBanners」的模塊可以向「Page」模型添加動態關係,而不實際更改「Page」模型中的代碼。 – Giedrius

+0

這不應該發生。在你的例子中,'EventModel'不應該獲得'PageModel'的關係,它們是兩個不同的實例。 – user3158900

回答

1

你有測試顯示這個?

所以,就表示你不想在子類中定義不會傳播到擴展父模型中的其他子實例是父類Late Static Bindings

靜態屬性。例如,Illuminate\Database\Eloquent\Model具有protected static $globalScopes = [];屬性,但當您將全局範圍添加到任何擴展爲Model的模型時,它會像在您的$dynamicRelationships陣列中那樣將其推入該陣列中,但這些實例不會反映在延伸爲Model的類中。

See Laravel's implementation of this here

+0

我認爲將'static :: class'作爲數組鍵的方法會更加優雅,但是如果框架是這樣做的,那麼它必須足夠好。非常感謝! – Giedrius