2013-03-07 22 views
6

Sto tentando di aggiungere un'entità utente a un'entità nell'evento preFlush. Fondamentalmente ogni entità ha un creato, che è un'entità Utente.Doctrine 2 preFlush Event Aggiungi classe associata

Ogni volta che ci provo, ricevo il seguente errore.

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

Questa è la mia funzione 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); 
} 

Cosa sto sbagliando?

+0

Questo 'preFlush()' è un evento del ciclo di vita sull'entità? O qual è il contesto più grande? Sono curioso perché devo fare qualcosa di simile, ma non so come legarlo tutto insieme. Non pensavo che il gestore dell'entità fosse disponibile nell'entità stessa? Non ho mai fatto un evento del ciclo di vita o un ascoltatore di eventi, quindi non so come dovrebbero interagire con il mio controller. –

risposta

3

Si stanno calcolando i changeset in modo errato. A seguito di bit:

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

viene eseguita solo sull'ultimo entità nel contesto controllato.

Si dovrebbe invece spostarlo foreach:

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

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

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

Ancora meglio (dal momento che non conosci la UnitOfWork API), si potrebbe ricalcolare tutti i gruppi di modifiche una volta alla fine unico:

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

$uow->computeChangeSets(); 

Si consiglia inoltre di spostare questo listener da preFlush a onFlush per gestire eventuali modifiche applicate da altri listener.

+0

Grazie ha funzionato a meraviglia – badllama77

+0

In quale contesto useresti questo codice per computeChangeSets? Si tratta di una funzione evento del ciclo di vita sull'entità? O un ascoltatore di eventi separato? In tal caso, come si registra il controller? –

+0

In genere su un listener di eventi esterno: entità e controller non hanno nulla a che fare con esso. – Ocramius