使用ZF2更改Doctrine上的DefaultEntityListenerResolver

道格拉斯·诺盖拉(Douglas Nogueira)

我试图更改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);
}}

但是我仍然无法联系服务经理,有什么建议吗?

道格拉斯·诺盖拉(Douglas Nogueira)

关键是我们实际上不需要更改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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用ZF2更改Doctrine上的DefaultEntityListenerResolver

来自分类Dev

ZF2 Doctrine 服务 - 多次调用

来自分类Dev

为什么要在ZF2上使用服务?

来自分类Dev

在zf2上使用会话(恢复容器)

来自分类Dev

zf2 doctrine2如何在实体列中使用tinyint数据类型

来自分类Dev

使用ZF2和Doctrine2将SQL Server表转换为MySQL

来自分类Dev

我如何在Doctrine 2 ODM中使用mongoDB在zf2中保存数据?

来自分类Dev

全局更改ZF2表单格式

来自分类Dev

在ZF2中使用Doctrine模块水化器和表单注释

来自分类Dev

如何使用命令行工具为ZF2和Doctrine生成“ getter / setter”?

来自分类Dev

配置中的ZF2 Doctrine2 setFilterSchemaAssetsExpression设置

来自分类Dev

ZF2和Doctrine2:模拟EntityRepository :: findOneByField

来自分类Dev

ZF2 Zend \ Log + Doctrine2

来自分类Dev

在ZF2项目中启用Doctrine 2缓存

来自分类Dev

配置中的ZF2 Doctrine2 setFilterSchemaAssetsExpression设置

来自分类Dev

如何使用wordpress运行zf2?

来自分类Dev

ZF2不推荐使用:ServiceManagerAwareInterface

来自分类Dev

使用REGEXP的ZF2查询

来自分类Dev

ZF2无法使用翻译

来自分类Dev

ZF2 Select语句:使用联接的表更改列顺序

来自分类Dev

ZF2:使用前向插件时,如何全局更改所有Controller的Request对象?

来自分类Dev

如何在ZF2中扩展字段集以使用Doctrine的类表继承映射策略

来自分类Dev

在使用ZF1和ZF2和MySql作为数据库的Doctrine的情况下,默认的隔离级别是多少?

来自分类Dev

ZF2翻译

来自分类Dev

ZF2:在ResultSet中更改行字段

来自分类Dev

ZF2:从控制器工厂更改视图脚本

来自分类Dev

ZF2输入过滤器更改消息颜色

来自分类Dev

zf2段路线在最后位置上的捕获ID

来自分类Dev

ZF2 +组合键上的重复表格验证

Related 相关文章

热门标签

归档