我试图更改Doctrine DefaultEntityListenerResolver失败。我需要在EntityListener定义的变形注释@ORM \ EntityListeners内部调用服务管理器。
因此,我已对此ListenerResolver进行编码,以检查侦听器是否实现了ServiceLocatorAwareInterface:
class ListenerResolver extends DefaultEntityListenerResolver {
private $serviceManager;
public function __construct(ServiceLocatorInterface $serviceManager){
$this->serviceManager = $serviceManager;
}
public function resolve($className){
$listener = parent::resolve($className);
if ($listener instanceof ServiceLocatorAwareInterface){
$listener->setServiceLocator($this->serviceLocator);
}
return $listener;
}
}
为了更改侦听器解析器,我在Module.php上创建了一个引导函数,以更改DoctrineORMModule上的解析器:
class Module {
public function onBootstrap(MvcEvent $e){
$serviceManager = $e->getTarget()->getServiceManager();
$resolver = new ListenerResolver($serviceManager);
$serviceManager->get('doctrine.entitymanager.orm_default')->getConfiguration()->setEntityListenerResolver($resolver);
}}
但是我仍然无法联系服务经理,有什么建议吗?
关键是我们实际上不需要更改EntityListenerResolver,只需要注册一个新行为即可。因此,我在引导程序的当前EntityListenerResolver上注册了侦听器。
1-在每个实体侦听器上实现ServiceLocatorAwareInterface。
namespace Application\Business\Entity\Listener;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
class User implements ServiceLocatorAwareInterface {
}
2-在Module.php上将实体侦听器注册为Invokables。
public function getServiceConfig()
{
return array(
'invokables'=>array(
//EntityListeners
'Application\Business\Entity\Listener\User'=>'Application\Business\Entity\Listener\User',
),
)
)
)
}
3-在Module.php的onBootstrap上注册侦听器,我通过遍历可调用项列表并搜索侦听器名称空间来做到这一点。
public function onBootstrap(MvcEvent $e){
$eventManager = $e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
//Inejct the Service Maganer on listeners
$serviceManager = $e->getApplication()->getServiceManager();
$entityManager = $serviceManager->get('Doctrine\ORM\EntityManager');
//Register the Entity Listeners
$config = $this->getServiceConfig();
$invokables = $config['invokables'];
foreach ($invokables as $invokable){ //Verify the listener namespaces
if((strpos($invokable, 'Application\Business\Entity') !== FALSE) &&(strpos($invokable, '\Listener') !== FALSE)){
$entityManager->getConfiguration()->getEntityListenerResolver()->register($serviceManager->get($invokable));
}
}
}
}
至此,您已经完成...现在可以在侦听器上自由使用$ this-> getServiceLocator()-> get()了。希望对您有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句