6

preFlushイベントのエンティティにユーザーエンティティを追加しようとしています。基本的に、各エンティティにはUserエンティティである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 に慣れていないため)、すべての変更セットを最後に 1 回だけ再計算できます。

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

$uow->computeChangeSets();

また、他のリスナーによって適用された変更を処理するために、このリスナーを からpreFlushに移動する必要があります。onFlush

于 2013-03-07T10:50:18.540 に答える