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