我需要使用 Alice Fixtures Bundle 保留一些固定装置,而不触发特定的实体监听器。
监听器通过 EntityListeners
注释与我的实体关联。
我不想改变监听器本身。
我创建了一个可以访问容器的自定义加载程序,希望在创建对象之前禁用所有监听器。
我已经尝试过this answer已经,但 $em->getEventManager()->getListeners()
不返回实体监听器。
ClassMetadata
为我提供了该实体的订阅实体监听器列表,但它只是一个只读数组。
有办法禁用这些实体监听器吗?
最佳答案
我找到了办法。
这就是我在加载器中所做的:
$em = $this->container->get('doctrine.orm.default_entity_manager');
$entitiesWithListeners = [
Post::class,
Comment::class
];
$listenersToDisable = [
MyListener::class
];
foreach ($entitiesWithListeners as $entity) {
$metadata = $em->getMetadataFactory()->getMetadataFor($entity);
foreach ($metadata->entityListeners as $event => $listeners) {
foreach ($listeners as $key => $listener) {
if (in_array($listener['class'], $listenersToDisable)) {
unset($listeners[$key]);
}
}
$metadata->entityListeners[$event] = $listeners;
}
$em->getMetadataFactory()->setMetadataFor($entity, $metadata);
}
我只需获取每个实体的元数据,将其从实体监听器中剥离,然后将其设置回相应的类。
虽然很难看,但是嘿,它确实有效。 由于我目前坚持使用 AliceBundle v1.4,并且当我们更新项目时我将不得不更改所有内容,这样就可以了。
关于Symfony、学说 : how to disable Entity Listeners?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53501620/