2013-03-07 2 views
6

Я пытаюсь добавить объект пользователя к сущности в событии preFlush. В основном каждый объект имеет созданнуюBy, которая является объектом User.Doctrine 2 preFlush Event Добавить ассоциированный класс

Всякий раз, когда я пытаюсь это сделать, я получаю следующее сообщение об ошибке.

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 ($uow->getScheduledEntityInsertions() as $entity) { 
    $entity->setCreatedBy($user); 
    $em->persist($user); 

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

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

Еще лучше (так как вы не знакомы с UnitOfWork API), можно пересчитать все ревизии, только один раз на конце:

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

$uow->computeChangeSets(); 

Вы также должны перенести этого слушателя с preFlush на номер onFlush, чтобы обрабатывать любые изменения, применяемые другими слушателями.

+0

Спасибо, что обработал – badllama77

+0

В каком контексте вы бы использовали этот код для competChangeSets? Является ли это функцией события жизненного цикла для объекта? Или отдельный прослушиватель событий? Если да, то как контроллер регистрирует это? –

+0

Обычно на внешнем прослушивателе событий сущности и контроллеры не имеют к этому никакого отношения. – Ocramius

Смежные вопросы