【发布时间】:2014-10-08 15:38:17
【问题描述】:
我有一些具有抽象类的实体: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" 并且正如文档所说的 recomputeSingleEntityChangeSet() :
传递的实体必须是托管实体。如果实体已经具有更改集,因为在提交周期中调用了此方法,则添加更改集。以这种方法检测到的变化为准。
所以很明显这里的问题是我的实体链接没有被管理。我怎样才能将它添加到 UnitOfWork 或其他东西以管理它?
【问题讨论】:
-
您是否尝试过使用
preFlushinstead ofpreUpdate?