暂时禁用学说实体侦听器

问题描述

无论何时创建实体,我都使用学说实体侦听器发送邮件。我希望能够在执行某些操作时禁用此事件侦听器(当我尝试用假实体填充数据库时,固定装置就会轰炸我)。

我尝试通过使用 EntityListenerResolver 类的 clear 方法禁用侦听器,但没有成功。

这是我的监听器配置:

services:
    mail_on_create_document_listener:
        class: App\EventListener\MailOnCreateDocumentListener
        autowire: true
        tags:
            -
                name: 'doctrine.orm.entity_listener'
                event: 'postPersist'
                entity: 'App\Entity\Document'

我尝试使用以下代码禁用监听器:

<?PHP

namespace App\DataFixtures;

use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;

class DebugFixture extends Fixture implements FixtureGroupInterface
{
    public function load(ObjectManager $manager)
    {
        $manager->getConfiguration()->getEntityListenerResolver()->clear(MailOnCreateDocumentListener::class);

        dump($manager->getConfiguration()->getEntityListenerResolver());
    }
}

这是EntityListenerResolver的结果转储

^ Doctrine\Bundle\DoctrineBundle\Mapping\ContainerEntityListenerResolver^ {#1233
  -container: Symfony\Component\DependencyInjection\Argument\ServiceLocator^ {#5278
    -factory: Symfony\Component\DependencyInjection\Container::getService($registry,string $id,?string $method,$load)^ {#283
      this: ContainerHYiq7Ex\srcApp_KernelDevDebugContainer {#4404 …}
    }
    -serviceMap: array:1 [
      "mail_on_create_document_listener" => array:4 [
        0 => "privates"
        1 => "mail_on_create_document_listener"
        2 => "getMailOnCreateDocumentListenerService.PHP"
        3 => true
      ]
    ]
    -serviceTypes: array:1 [
      "mail_on_create_document_listener" => "?"
    ]
    -externalId: null
    -container: null
    -factories: array:1 [
      "mail_on_create_document_listener" => array:4 [
        0 => "privates"
        1 => "mail_on_create_document_listener"
        2 => "getMailOnCreateDocumentListenerService.PHP"
        3 => true
      ]
    ]
    -loading: []
    -providedTypes: null
  }
  -instances: []
  -serviceIds: array:1 [
    "App\EventListener\MailOnCreateDocumentListener" => "mail_on_create_document_listener"
  ]
}

读取code时,看来 EntityListenerResolver clear 影响了实例部分,但不影响serviceIds。

clear 方法应该如何工作? 我的服务声明有误吗?

编辑:我也尝试了此代码,但未成功

        $evm = $manager->getEventManager();
        $listeners = $evm->getListeners("postPersist");
        while (count($listeners))
        {
            $evm->removeEventListener(array("postPersist"),array_pop($listeners));
        }

但是我读到实体侦听器与其他侦听器有很大不同,尽管不清楚两者之间有什么区别。这是doc的引文:

与事件不同,仅对指定实体调用实体侦听器

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)