问题描述
无论何时创建实体,我都使用学说实体侦听器发送邮件。我希望能够在执行某些操作时禁用此事件侦听器(当我尝试用假实体填充数据库时,固定装置就会轰炸我)。
我尝试通过使用 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 (将#修改为@)