如何在不使用 services.yml 模式的情况下向内核动态添加一个事件监听器(在我的例子中是一个 Doctrine 事件)?
最佳答案
在深入研究 vendor 目录和 appProdProjectContainer.php
文件后,我自己找到了答案。如果您希望您的事件在事件管理器中注册,您必须在 services.yml
中为您希望触发的事件指定标签,例如:
event_listener:
class: Company\MyBundle\Listener\MyListener
arguments: [@security.context, @logger]
tags:
-
name: doctrine.event_listener
event: preRemove
-
name: doctrine.event_listener
event: onFlush
现在如果你想动态注册这些事件,你需要在services.yml
中保留event_listener
资源,但是删除标签部分,然后动态添加它们作为关注:
if (something) {
$evm = $em->getConnection()->getEventManager();
$evm->addEventListener(
[
0 => 'preRemove',
1 => 'onFlush'
],
$this->container->get('event_listener');
}
关于Symfony2 动态添加事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31950983/