如何解决暂时禁用学说实体侦听器
无论何时创建实体,我都使用学说实体侦听器发送邮件。我希望能够在执行某些操作时禁用此事件侦听器(当我尝试用假实体填充数据库时,固定装置就会轰炸我)。
我尝试通过使用 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 举报,一经查实,本站将立刻删除。