2012-11-11 132 views
9

我在Zend Framework 2应用程序中使用Doctrine 2。有什么方法可以使用ZF2将依赖关系注入由Doctrine返回的实体?从数据库中检索时,实体由Doctrine构建。据我所知在ZF2中注入依赖关系,我需要使用Service Locator实例化实体。我看不出如何将其与教义整合,而无需修改教义代码库。我现在看到的唯一可行的解​​决方案是编写一个小型服务,它接受从Doctrine返回的结果并注入所需的依赖关系。有没有更优雅的解决方案?ZF2与Doctrine 2 - 在实体中注入依赖关系

问候 基督教

+0

什么你想要注入吗?我无法想象一个将某些东西注入实体的情况。我确信有一种方法可以做到你想要的东西符合这个概念。 –

+0

在此期间,我采取了另一个方向。我想委托给实体本身的事物现在被委托给管理这些实体的服务。因此,不需要再向实体注入某些东西 – griesi

回答

16

看进学说EventManager,特别是postLoad生命周期事件,这是由eventmanager进行每一个实体从数据库加载时间发射。

要将它全部整合到ZF2中,您需要做几件事情。

首先,写一个学说味的事件侦听器:

<?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)); 

} 
+0

是的,但是我看不到我如何将它与ZF2服务定位器/服务管理器连接以注入由ZF2管理的依赖关系。实体本身不知道服务定位器,因为它没有通过服务定位器实例化。 – griesi

+0

@griesi - 参见我编辑的一些示例代码,它初始化侦听器并在ZF2引导过程中将它们附加到原则的EventManager中。 – timdev

+0

Thank's这就是我正在寻找 – griesi