ZF2 with Doctrine 2 - 在实体中注入依赖关系

时间:2012-11-11 18:33:06

标签: zend-framework2

我在Zend Framework 2应用程序中使用Doctrine 2。有没有办法使用ZF2将依赖项注入Doctrine返回的实体?当从数据库中检索时,实体由Doctrine构造。据我所知,在ZF2中注入依赖项我需要使用Service Locator实例化实体。我无法看到如何将其与Doctrine集成,而无需修改Doctrines代码库。我现在能看到的唯一可行解决方案是编写一个小服务,它从Doctrine返回结果并注入所需的依赖项。有更优雅的解决方案吗?

最诚挚的问候 基督徒

1 个答案:

答案 0 :(得分:16)

查看Doctrine EventManager,特别是postLoad生命周期事件,每次从数据库加载实体时,EventManager都会触发该事件。

要把它全部挂钩到ZF2,你需要做几件事。

首先,编写一个Doctrine-Flavored事件监听器:

<?php
class InjectStuffListener {
   private $sl;

   public function __construct($serviceLocator){
      $this->sl = $serviceLocator;
   }

   public function postLoad($eventArgs){
       $entity = $eventArgs->getEntity;
       $entity->setThingToBeInjected($this->sl->get('some.thing'));
   }
}

然后,在某些地方,比如某些Module.php(也许比onBootstrap更好,但无论如何):

<?php
public function onBootstrap(){
    $sm = $e->getApplication()->getServiceManager();
    $em = $sm->get('doctrine.entitymanager.orm_default');
    $dem = $em->getEventManager();
    $dem->addEventListener(array( \Doctrine\ORM\Events::postLoad ), new InjectStuffListener( $sm ) );

}