Doctrine事件监听器和softdeleted过滤器

时间:2018-03-17 14:15:55

标签: symfony doctrine

我有实体答案,我使用softdeleted过滤器,当我在某个操作中移除实体一切正常时,我已删除了datetime,但是当我尝试在OnFlushEvent我的实体中删除此实体时从DB走了,为什么?

 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 }

我检查过,启用了此过滤器,我尝试强制启用但没有帮助

1 个答案:

答案 0 :(得分:1)

我认为这个问题可能与订阅者的优先级有关。

事实上似乎SoftDeleteableListener实现了一个订阅者,它使用onFlush()事件收集实体到softdelete,我们可以看到here。因此,如果您的事件在softdeletable之后被触发,那么您的实体通常会从Doctrine中删除。

要避免这种情况,我会在您的订阅者身上设置priotity,以便在SoftDeleteableListener之前触发您的活动

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