我正在使用Doctrine(没有symfony)开发php应用程序,因此没有DI容器。 我在一个需要服务的实体中使用依赖注入。
Class A implements Ia
{
public function __constructor( \requiredServiceClass $requiredService = NULL )
{
if ($requiredService === NULL) {
$this->requiredService = new \requiredServiceClass();
{
$this->requiredService = $requiredService;
}
}
}
每一件事情都很好但是在保湿时,Doctrine并没有调用__constructor,因此不会注入依赖关系。 什么是解决这个问题的最佳方法?
目前,我使用Doctrine生命周期事件来回调设置依赖关系的方法。 首先,我将生命周期回调添加到实体的映射文件中
<lifecycle-callbacks>
<lifecycle-callback type="postLoad" method="setRequiredService"/>
</lifecycle-callbacks>
然后在被调用的方法中注入应用setter依赖注入的依赖项。
public function setRequiredService()
{
$this->requiredService = new \requiredServiceClass();
}
我的问题: 这是在Doctrine中解决依赖注入的最佳方法吗? 将默认情况下的DI参数传递给NULL是否可以?
谢谢, Abhinit Ravi
答案 0 :(得分:0)
它是否在数据库中为此“服务”存储任何信息我不知道那是什么。
如果是这样,您可以将其定义为自定义数据类型。 这是关于该主题的学说文档的链接。
http://doctrine-orm.readthedocs.org/en/latest/cookbook/custom-mapping-types.html
http://docs.doctrine-project.org/en/2.0.x/cookbook/mysql-enums.html
我没有看到任何问题,如果它只是你需要的一些类,不确定不知道什么服务是什么,重组代码可能更好,所以它不需要这个,但我不知道不知道是什么那样做。
我说你这样做的方式很好,不确定onLoad是否仅在从数据库中拉出时被触发但你可能想要检查是否为null。
我可以用这种方式写课
Class A implements Ia
{
protected $requiredService; //null by default
public function __constructor( \requiredServiceClass $requiredService = NULL )
{
$this->setRequiredService($requiredService);
}
public function postLoad(){
$this->setRequiredService();
}
public function setRequiredService(\requiredServiceClass $requiredService = NULL)
{
if(NULL === $this->requiredService){
//check if class has service - assuming you never want to set it again once it is set.
if(NULL === $requiredService){
$this->requiredService = new \requiredServiceClass();
}else{
$this->requiredService = $requiredService;
}
}
}
}
<lifecycle-callbacks>
<lifecycle-callback type="postLoad" method="postLoad"/>
</lifecycle-callbacks>
我的理由是。