我需要使用Alice fixtures Bundle持久化一些fixture,而不触发特定的实体侦听器
侦听器通过EntityListeners
注释与我的实体相关联
我宁愿不改变听众本身。
我创建了一个可以访问容器的自定义Loader,希望在创建对象之前禁用所有侦听器。
我已经尝试过这个答案,但$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卡住了,当我们更新项目时,我必须更改所有内容,这就可以了。
您可以使用EntityListenerResolver
API
$em->getConfiguration()->getEntityListenerResolver()->clear();
或者如果你想清除特定类的监听器
$em->getConfiguration()->getEntityListenerResolver()->clear(YourEntityListener::class);
有关详细信息,请参阅EntityListenerResolver接口。