2016-11-28 80 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