【问题标题】:Disabling eventListener on doctrine onFlush while loading fixtures在加载夹具时禁用 onFlush onFlush 上的 eventListener
【发布时间】:2018-12-27 08:29:40
【问题描述】:

当应用用户对一堆现有实体进行修改时,我必须保留新实体(可追溯性问题)。我在 Doctrine onFlush 事件上创建了一个 EventListener。问题是:这不应该在固定装置加载时发生。 我这样做是为了防止固定装置触发侦听器,但我想知道这是否是一个好的解决方案:

在我的services.yaml

App\DataFixtures\:
    class: App\DataFixtures\LoadFixtures
    tags: [name: doctrine.fixture.orm]
    arguments:
        - '@doctrine.orm.default_entity_manager.event_manager'

在我的App\DataFixtures\LoadFixtures:

public function __construct(EventManager $eventManager)
{
    $this->eventManager = $eventManager;
}

public function load(ObjectManager $manager)
{
   $historizationManager = null;

   foreach ($this->eventManager->getListeners() as $event =>$listeners){
       foreach ($listeners as $key => $listener){
           if($listener instanceof HistorizationManager){
               $historizationManager = $listener;
           }
       }
   }

   if($historizationManager){
       $this->eventManager->removeEventListener(array('onFlush'),$onFlushHistoryListener);
   }

   // doing some work
}

这是我提供的最简单的解决方案,如果有问题请告诉我。

【问题讨论】:

    标签: doctrine event-listener fixtures


    【解决方案1】:

    如果这仍然是个问题,您可以尝试以下方法:

    • 在EventSubscriber类中添加enabled标志,默认true
    • 使用自动装配使该订阅者在您的夹具加载器中可用
    • 在加载第一个夹具之前将标志设置为false
    • 最后,在处理事件之前检查该标志

    但如果你找到了更好的方法,我很高兴收到你的来信

    澄清如何将标志设置为false:您通常在test 环境中运行测试。通过使用config_test.yaml 之类的配置文件,您可以覆盖默认服务配置,例如:

    services:
      App\EventSubscribers\YourSubscriber:
        calls:
          - ['setEnabled', [false]]
    

    【讨论】:

    • 在加载第一个夹具之前如何将标志设置为 false?
    • “如何”是什么意思?把它写在你的课堂上
    猜你喜欢
    • 2017-03-27
    • 2013-10-28
    • 2016-03-24
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 2016-10-16
    • 2013-10-11
    • 2014-06-29
    相关资源
    最近更新 更多