1

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

在我的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
}

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

4

1 回答 1

-1

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

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

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

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

services:
  App\EventSubscribers\YourSubscriber:
    calls:
      - ['setEnabled', [false]]
于 2019-01-04T15:26:21.870 回答