使用 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()... 希望对你有帮助..