Symfony2 动态添加事件监听器

标签 symfony doctrine-orm doctrine

如何在不使用 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/

相关文章:

symfony - 将 PHPExcel 与 Composer 和 Symfony2.2 结合使用

php - Symfony2 : Entity created but, 给的类不存在

mongodb - Silex 和 MongoDB,其中 Silex Extension

symfony - 上限部署 :cleanup fails with use_sudo=true

symfony - 实体中的Symfony/原则关系COUNT

php - Doctrine 缓存 - 升级到 PHP 5/6

php - Symfony2 : DateTime object not working

mysql - 两个数据库表以两种不同的方式相关......?

php - Doctrine 模型的默认排序属性

php - 拥有 +100 个用户的 Symfony2 网站 = 100% CPU 费用