Php Symfony原则侦听器-在preRemove事件中删除实体之前更新实体

Php Symfony原则侦听器-在preRemove事件中删除实体之前更新实体,php,symfony,doctrine,Php,Symfony,Doctrine,更新 如果在preRemove侦听器中调用了flush,则此操作有效,但如果未调用flush,则此操作无效。它最初不起作用的原因是由于我使用的一些其他代码阻止了对flush的调用 我只是想提一下,以防其他人看到这篇文章 我有一个在Doctrine preRemove事件上注册的。在侦听器上的preRemove方法中,我希望在从数据库中删除实体之前更新要删除的实体。下面是一些示例代码: public function preRemove(LifecycleEventArgs $args) {

更新

如果在preRemove侦听器中调用了flush,则此操作有效,但如果未调用flush,则此操作无效。它最初不起作用的原因是由于我使用的一些其他代码阻止了对flush的调用

我只是想提一下,以防其他人看到这篇文章

我有一个在Doctrine preRemove事件上注册的。在侦听器上的preRemove方法中,我希望在从数据库中删除实体之前更新要删除的实体。下面是一些示例代码:

public function preRemove(LifecycleEventArgs $args)
{
    $em = $args->getEntityManager();
    $entity = $args->getEntity();
    $entity->setDeletedOn(new \DateTime());
    $entity->setDeletedBy($this->tokenStorage->getToken()->getUser());
    dump($entity); // this shows the updated columns
    $em->persist($entity);
    $em->flush(); // tried adding a flush to see if it would work
}
这不管用。我可以看到preRemove方法肯定正在被调用,并且正在设置deletedOn和deletedBy属性,但是当我在symfony profiler中查看数据库查询时,它不包含UPDATE语句,只包含DELETE语句

有没有人知道我是否遗漏了什么,或者是否有更好的方法来实现这一点?看起来,如果我想创建或更新一个不同的实体,这很好。但是如果我试图更新被删除的同一个实体,Doctrine就不会发出update语句


注意:DB表具有after insert和after update触发器,用于将行复制到存档表中。我需要在DELETE语句之前运行一个UPDATE语句,这样记录将被复制到存档表中,并带有deletedOn和deletedBy的适当值。删除后触发器将不起作用,因为数据库不知道当前Symfony用户是谁

当条令计算更新该行的最小工作量时,如果删除该行,则删除该行优于所有其他操作,它只会这样做,不必担心更新。

您需要使用postRemove方法而不是preRemove。您可以在postRemove中执行flush方法来更新任何其他实体。

仅供参考:您应该确保$entity是提供setDeleted[On | By]方法的类的实例。这是显示问题的简化代码示例。实际类使用反射方法来确保实体具有setDeletedOn和setDeletedBy方法。考虑了一个接口,并检查实体是否实现了它,但现在使用反射方法。它还有prePersist和preUpdate方法,它们工作得很好。这就是我害怕的。因此,用条令事件侦听器似乎无法做到这一点,相反,我需要一个服务来手动更新列,然后每次调用remove。