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

标签 symfony doctrine

我有实体答案,我对它们使用 softdeleted 过滤器,当我在某些操作中删除实体时一切正常,我已在日期时间删除,但是当我尝试在 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 }

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

最佳答案

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

事实上,SoftDeleteableListener 似乎也实现了一个订阅者,它使用 onFlush() 事件收集实体以进行软删除,如我们所见 here 。因此,如果您的事件在软删除事件之后触发,您的实体通常会从 Doctrine 中删除。

为了避免这种情况,我会在您的订阅者上设置 priority ,以便在 SoftDeleteableListener 事件之前触发您的事件

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

关于symfony - Doctrine 事件监听器和软删除过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49337895/

相关文章:

mysql - 如何在 Symfony 4 中通过 Doctrine 创建数据库表?

php - Doctrine 2 多个选择元素、别名、日期格式

php - Symfony2学说mysql IN查询

Symfony 4 getter setter 不是从现有数据库生成的

symfony - Doctrine 查询生成器,其中 ManyToMany 的计数大于

php - 复制一个包含所有关系的 Doctrine 对象

service - Symfony3 : Service not able to get arguments

Symfony 缓存组件 - Redis 适配器

symfony - 在TWIG中,是否可以获得带有 Twig 变量的链接的绝对URL?

php - Symfony 5 无法将 EntityManagerInterface 注入(inject)验证器