Symfony,学说:如何禁用实体监听器



我需要使用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卡住了,当我们更新项目时,我必须更改所有内容,这就可以了。

您可以使用EntityListenerResolverAPI

$em->getConfiguration()->getEntityListenerResolver()->clear();

或者如果你想清除特定类的监听器

$em->getConfiguration()->getEntityListenerResolver()->clear(YourEntityListener::class);

有关详细信息,请参阅EntityListenerResolver接口。

相关内容

  • 没有找到相关文章

最新更新