Doctrine事件监听器和软删除过滤器

3

我有实体答案,并对它们使用softdeleted过滤器。当我在某些操作中删除实体时,一切都很好,我有一个deletedAt日期时间。但是当我尝试在OnFlushEvent中删除此实体时,我的实体就从数据库中消失了,为什么?

 public function onFlush(OnFlushEventArgs $args)
{
    $em = $args->getEntityManager();
    $uow = $em->getUnitOfWork();
    $em->getFilters()->enable('softdeleteable');
    foreach ($uow->getScheduledEntityUpdates() as $entity) {
        if ($entity instanceof Questions) {
            $existAnswers = $this->container->get('app.repository.question_answers')
                ->findOneBy(['questions' => $entity]);
                        $em->remove($existAnswers);                                                          
        }
    }
}

实体

 * @Gedmo\SoftDeleteable(fieldName="deletedAt")
 */
class QuestionAnswers

配置服务

    app.doctrine_listener:
    class: AppBundle\Listener\DoctrineListener
    calls:
        - [setContainer, ['@service_container']]
    tags:
        - { name: doctrine.event_subscriber, connection: default }

我查看了一下,这个过滤器已经启用了,我尝试强制启用但没有帮助


你能添加你的监听器服务定义吗? - DrKey
当然,更新的问题 - shuba.ivan
1个回答

1
我认为问题可能与订阅者优先级有关。
实际上,似乎SoftDeleteableListener也实现了一个订阅者,它使用onFlush()事件收集要软删除的实体,如我们可以在这里看到。因此,如果您的事件在可软删除的事件之后触发,则您的实体将从Doctrine中正常删除。
为了避免这种情况,我建议在您的订阅者上设置priority,以便在SoftDeleteableListener之前触发您的事件。
app.doctrine_listener:
    class: AppBundle\Listener\DoctrineListener
    calls:
        - [setContainer, ['@service_container']]
    tags:
        - { name: doctrine.event_subscriber, connection: default, priority: -256 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接