Symfony2动态添加事件侦听器

Rez*_*a S 3 doctrine symfony doctrine-orm

如何在不使用services.yml模式的情况下动态地向内核添加事件监听器(在我的情况下,它是一个doctrine事件)?

Rez*_*a S 5

在深入挖掘供应商目录和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
Run Code Online (Sandbox Code Playgroud)

现在,如果要动态注册这些事件,则需要保留event_listener资源services.yml,但删除标记部分并动态添加它们,如下所示:

if (something) {
  $evm = $em->getConnection()->getEventManager();
  $evm->addEventListener(
      [
        0 => 'preRemove',
        1 => 'onFlush'
      ],
      $this->container->get('event_listener');
}
Run Code Online (Sandbox Code Playgroud)