6

我正在尝试将用户实体添加到 preFlush 事件上的实体。基本上每个实体都有一个createdBy,它是一个用户实体。

每当我尝试这个时,我都会收到以下错误。

Notice: Undefined index: 0000000055f036b6000000009c9cc58f in /dir/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 870 

这是我的 preFlush 函数。

public function preFlush(PreFlushEventArgs $args)
{
    $em = $args->getEntityManager();
    $uow = $em->getUnitOfWork();
    $securityContext = $this->container->get('security.context');
    if($securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED') 
        || $securityContext->isGranted('IS_AUTHENTICATED_FULLY'))
    {
        $user = $securityContext->getToken()->getUser();
    }
    if(!$user)
    {
        $user = $em->getRepository('NAB\EnterpriseBundle\Entity\User')->findOneByUsername($this->username);
    }
    foreach ($uow->getScheduledEntityInsertions() as $entity)
    {
        $entity->setCreatedBy($user);
        $em->persist($user);

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

我究竟做错了什么?

4

1 回答 1

3

您正在错误地计算变更集。以下位:

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

仅在检查的上下文中的最后一个实体上执行。

你应该把它移到你的 foreach 中:

foreach ($uow->getScheduledEntityInsertions() as $entity) {
    $entity->setCreatedBy($user);
    $em->persist($user);

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

    $uow->recomputeSingleEntityChangeSet($meta, $entity);
}

更好的是(因为您不熟悉UnitOfWorkAPI),您可以只在最后重新计算所有变更集:

foreach ($uow->getScheduledEntityInsertions() as $entity) {
    $entity->setCreatedBy($user);
    $em->persist($user);
}

$uow->computeChangeSets();

您还应该将此侦听器从 移动preFlushonFlush以处理其他侦听器应用的任何更改。

于 2013-03-07T10:50:18.540 回答