使用 ZF2 更改 Doctrine 上的 DefaultEntityListenerResolver
Change the DefaultEntityListenerResolver on Doctrine with ZF2
我试图更改 Doctrine DefaultEntityListenerResolver 但没有成功。
我需要在 EntityListener 中调用服务管理器定义的 trought 注释 @ORM\EntityListeners.
所以我编写了这个 ListenerResolver 来检查 Listener 是否实现了 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 上创建了一个 bootstrap 函数来更改 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,我们只需要注册一个新的行为。所以我在 bootstrap.
上的当前 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()...
希望对你有帮助..
我试图更改 Doctrine DefaultEntityListenerResolver 但没有成功。 我需要在 EntityListener 中调用服务管理器定义的 trought 注释 @ORM\EntityListeners.
所以我编写了这个 ListenerResolver 来检查 Listener 是否实现了 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 上创建了一个 bootstrap 函数来更改 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,我们只需要注册一个新的行为。所以我在 bootstrap.
上的当前 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()... 希望对你有帮助..