Doctrine orm Doctrine2:preFlush getScheduledEntityInsertions()可以工作,但getScheduledEntityUpdates()不能工作

Doctrine orm Doctrine2:preFlush getScheduledEntityInsertions()可以工作,但getScheduledEntityUpdates()不能工作,doctrine-orm,Doctrine Orm,我有一些抽象类的实体:EntityDated,这意味着实体包含4个公共字段:created,updated,created\u by和updated\u by。我希望在创建实体时更新4个数据,并在更新实体时更新“updated”和“updated by” 我做了一个服务,给我的听众打电话: public function preFlush(PreFlushEventArgs $eventArgs) { $token = $this->container->ge

我有一些抽象类的实体:
EntityDated
,这意味着实体包含4个公共字段:
created
updated
created\u by
updated\u by
。我希望在创建实体时更新4个数据,并在更新实体时更新“
updated
”和“
updated by

我做了一个服务,给我的听众打电话:

public function preFlush(PreFlushEventArgs $eventArgs)
    {
        $token = $this->container->get('security.context')->getToken();
        $em = $eventArgs->getEntityManager();
        $uow = $em->getUnitOfWork();

        // Inserts
        foreach ($uow->getScheduledEntityInsertions() as $entity) {
            if (is_subclass_of($entity, 'Kiwi\Bundle\TrainingBundle\Entity\EntityDated')) {

                $entity->setCreated(new \Datetime()); 
                $entity->setCreatedBy($token->getUser()->getUsername());
                $entity->setUpdated(new \Datetime()); 
                $entity->setUpdatedBy($token->getUser()->getUsername()); 

            }
        }

        // Updates
        foreach ($uow->getScheduledEntityUpdates() as $entity) {
            if (is_subclass_of($entity, 'Kiwi\Bundle\TrainingBundle\Entity\EntityDated')) {

                $entity->setUpdated(new \Datetime()); 
                $entity->setUpdatedBy($token->getUser()->getUsername()); 

            }
        }
    }

这仅适用于插入,不适用于更新(保存更改,但更新和更新方式保持不变)。如果我调试
$uow->getScheduledEntityUpdates()
,我会看到它是空的。为什么这里不管理更新的实体?

为了执行插入和更新,我必须更改两点:

  • 使用
    onFlush()
    ,而不是
    preFlush()
  • 在每次更改后添加重新计算SingleEntityChangeSet()
新守则:

public function onFlush(OnFlushEventArgs $eventArgs)
{

    $token = $this->container->get('security.context')->getToken();
    $em = $eventArgs->getEntityManager();
    $uow = $em->getUnitOfWork();

    // Inserts
    foreach ($uow->getScheduledEntityInsertions() as $entity) {
        if (is_subclass_of($entity, 'Kiwi\Bundle\TrainingBundle\Entity\EntityDated')) {

            $entity->setCreated(new \Datetime()); 
            $entity->setCreatedBy($token->getUser()->getUsername());
            $entity->setUpdated(new \Datetime()); 
            $entity->setUpdatedBy($token->getUser()->getUsername()); 

            $meta = $em->getClassMetadata(get_class($entity));
            $uow->recomputeSingleEntityChangeSet($meta, $entity);

        }
    }

    // Updates
    foreach ($uow->getScheduledEntityUpdates() as $entity) {
        if (is_subclass_of($entity, 'Kiwi\Bundle\TrainingBundle\Entity\EntityDated')) {

            $entity->setUpdated(new \Datetime()); 
            $entity->setUpdatedBy($token->getUser()->getUsername());

            $meta = $em->getClassMetadata(get_class($entity));
            $uow->recomputeSingleEntityChangeSet($meta, $entity); 

        }                
    }

}

与其循环遍历orm处理的所有实体,不如在摘要的构造函数中添加插入代码,并对更新的字段使用preUpdate事件?因为我需要访问当前用户身份验证(按字段设置更新的_),而这在实体上下文中是不可能的。我试过preUpdate(),它很好用,但不适用于相关的实体。你应该听onFlush()而不是preFlush。尚未计算更改集。请确保重新计算。preFlush正在按设计工作。手册很清楚。跟踪新实体很容易,这就解释了insert工作的原因。确定哪些实体需要更新需要计算变更集。在preFlush和onFlush之间执行的操作。您是否看到了在更改实体后必须重新计算实体的部分?您可能想看看这里: