Symfony、学说 : how to disable Entity Listeners?

标签 symfony doctrine-orm

我需要使用 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/

相关文章:

symfony - 如何从 ResultSetMapping 获取关联数组?

php - 模型类在 symfony2 中放在哪里

php - Doctrine + Twig,如何在有限制的 OneToMany 关系中显示 Doctrine 集合?

php - 学说 2.0 Bootstrap ?

php - Symfony主义OneToOne嵌入式表单error_bubbling

php - Doctrine 无法坚持删除记录

symfony - Symfony2 中需要登录的页面 URL

php - Symfony2 命令结果超出文件大小限制

php - 注册后自动记住我

symfony - 扩展 EntityType 以允许通过 AJAX 调用设置额外的选择