【问题标题】:Symfony2 : How to auto update associated entity field with entity listener?Symfony2:如何使用实体侦听器自动更新关联的实体字段?
【发布时间】:2014-10-08 15:38:17
【问题描述】:

我有一些具有抽象类的实体:EntityDated,这意味着该实体包含 4 个公共字段:createdupdated created_byupdated_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" 并且正如文档所说的 recomputeSingleEntityChangeSet() :

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

所以很明显这里的问题是我的实体链接没有被管理。我怎样才能将它添加到 UnitOfWork 或其他东西以管理它?

【问题讨论】:

标签: symfony listener entities


【解决方案1】:

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

  • 使用onFlush(),而不是preFlush()
  • 在每次更改后添加 recomputeSingleEntityChangeSet()

新代码:

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

        }                
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多