我正在使用yadif的修改副本作为我的依赖注入框架 .
目前,我已经创建了一个名为AContainerAware的抽象类,它类似于symfony2的ContainerAware:
abstract class AContainerAware{
protected $_container;
public function setContainer(Container $container){
$this->_container = $container;
}
protected function get($component){
//return a component from $this->_container;
}
}
这在大多数情况下效果很好 . 我只是让类需要容器来扩展AContainerAware,并且在使用 setContainer()
创建对象期间,DI框架会自动注入容器 . 然后我可以轻松地从容器中获取组件 .
问题在于使用第三方供应商包时 . 在这些情况下,例如为twig编写扩展名需要我扩展 Twig_Extension
类,这意味着我无法扩展 AContainerAware
来访问容器 .
我正在考虑是否将 AContainerAware
转换为接口 IContainerAware
. 由于类可以实现多个接口,因此在大多数情况下应该可以实现 IContainerAware
. 这种方法的唯一问题是无法在接口中为 setContainer()
和 get()
编写任何代码,因此必须在每个需要容器的类中实现这些函数的确切代码是重复的 . 如果 setContainer()
和 get()
将来发生变化,它也会造成维护问题 .
是否有更好的方法来标记容器注入类?
1 回答
您可以使用PHP 5.4中引入的PHP traits .
Traits支持代码的水平重用,而继承是垂直重用 . 类可以使用多个特征,而您只能继承一个父类 .