使用Doctrine Lifecycle回调进行依赖注入,同时进行干燥

时间:2014-07-03 19:23:44

标签: php dependency-injection doctrine-orm

我正在使用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

1 个答案:

答案 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>

我的理由是。

  1. 这样,在将服务注入之前,所有检查都是正确的 上课。
  2. 清楚地看到使用生命周期回调的代码。
  3. 更好地分离关注点,即。构造函数 不应该关心检查requiredService的状态, 它只是传递它。与回调相同。
  4. 您是否需要重置服务(删除外部if) setRequiredService你不需要改变构造函数中的逻辑等。