2013-03-07 16 views
6

preFlushイベントのエンティティにユーザーエンティティを追加しようとしています。基本的に各エンティティは、UserエンティティであるcreatedByを持っています。Doctrine 2 preFlushイベント関連クラスの追加

これを試すと、次のエラーが表示されます。

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

私は間違っていますか?

+0

この 'preFlush()'はエンティティのライフサイクルイベントですか?あるいは、より大きな文脈は何ですか?私は似たようなことをする必要があるので好奇心が強いですが、一緒に結び付ける方法はわかりません。エンティティマネージャがエンティティ自体で利用可能であるとは思わなかったのですか?私はライフサイクルイベントやイベントリスナーを行ったことがないので、コントローラとどうやって対話するべきか分かりません。 –

答えて

3

チェンジセットが正しく計算されていません。ビット以下の:

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

確認文脈でのみ、最後のエンティティ上で実行されます。

あなたが代わりにあなたのforeachに移動する必要があります(あなたがUnitOfWork APIに精通していないので)

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

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

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

さらに良いことに、あなただけの最後に一度、すべてのチェンジセットを再計算することができます:

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

$uow->computeChangeSets(); 

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

+0

ありがとうございました – badllama77

+0

このコードを使用してどのコンテキストでcomputeChangeSetsを使用しますか?これはエンティティのライフサイクルイベント機能にありますか?または別のイベントリスナー?もしそうなら、コントローラはどのようにこれを登録しますか? –

+0

通常、外部イベントリスナーでは、エンティティとコントローラは関係ありません。 – Ocramius

関連する問題