Symfony2:如何使用实体侦听器自动更新关联的实体字段?

Symfony2:如何使用实体侦听器自动更新关联的实体字段?,symfony,listener,entities,Symfony,Listener,Entities,我有一些抽象类为EntityDated的实体,这意味着实体包含4个公共字段:created、updated、created_by和updated_by。 我希望在创建实体时更新4个数据,并在更新实体时更新“updated”和“updated_by” 我做了一个服务,给我的听众打电话: public function preUpdate(PreUpdateEventArgs $eventArgs) { $token = $this->container->get

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

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

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

        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);
        }
    }
这非常适用于没有实体链接的简单实体,但只要我尝试添加一个实体链接,例如,我将一个实体响应添加到我的实体问题的$responses数组中,我就会出现以下错误:

Notice: Undefined index: 0000000060e7f05700000000e7f2194b in C:\wamp\www\kiwi\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php line 1359
问题在于,链接实体不是通过直接调用$em->persist来持久化的,而是通过行为:cascade=persist来持久化的,正如文档所说的关于重新计算SingleEntityChangeSet:

传递的实体必须是托管实体。如果由于在提交周期中调用此方法,实体已具有更改集,则会添加更改集。以本方法检测到的变化为准


很明显,这里的问题是我的实体链接没有被管理。如何将其添加到UnitOfWork或其他内容中以管理它?

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

使用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); 

        }                
    }

}
你试过使用吗?