2013-06-03 13 views
11

Ich habe einen PreUpdate-Listener in meiner App. Wenn es ausgelöst wird, möchte ich, dass es einige zusätzliche Datensätze erstellt. Ein vereinfachtes Beispiel der grundlegenden Funktionalität ist unten. In dieser aktuellen Implementierung scheint es, dass die neuen Ereignisse nicht beibehalten werden. Gibt es andere Anrufe, die ich hier machen muss? Vielen Dank.Hinzufügen weiterer Persist-Aufrufe zu Pre-update-Aufruf in Symfony 2.1

public function preUpdate(Event\LifecycleEventArgs $eventArgs) 
{ 
    $em = $eventArgs->getEntityManager(); 
    $uow = $em->getUnitOfWork(); 
    $entity = $eventArgs->getEntity(); 

    $updateArray = $eventArgs->getEntityChangeSet(); 

    //Updates 
    if (($entity instanceof Bam) === false) { 
     $thing = new OtherThing(); 
     $thing->setFoo('bar'); 

     $uow->persist($thing); 
    } 

    $uow->computeChangeSets(); 
} 
+0

Was ist '$ historyRecord'? – cheesemacfly

+0

Typo, korrigiert. – keybored

Antwort

26

Der Schlüssel ist, sie nach dem Flush zu beharren:

<?php 

namespace Comakai\CQZBundle\Handler; 

use Symfony\Component\DependencyInjection\ContainerInterface; 
use Doctrine\Common\EventSubscriber; 
use Doctrine\ORM\Event; 

/** 
* 
*/ 
class YourHandler implements EventSubscriber 
{ 
    protected $things = []; 

    public function getSubscribedEvents() 
    { 
     /** 
     * @todo Check if this is running in the console or what... 
     */ 
     if (isset($_SERVER['HTTP_HOST'])) { 

      return [ 
       'preUpdate', 
       'postFlush' 
      ]; 
     } 

     return []; 
    } 

    public function preUpdate(Event\LifecycleEventArgs $eventArgs) 
    { 
     $em = $eventArgs->getEntityManager(); 
     $uow = $em->getUnitOfWork(); 
     $entity = $eventArgs->getEntity(); 

     $updateArray = $eventArgs->getEntityChangeSet(); 

     //Updates 
     if (($entity instanceof Bam) === false) { 

      $thing = new OtherThing(); 
      $thing->setFoo('bar'); 

      $this->things[] = $thing; 
     } 
    } 

    public function postFlush(Event\PostFlushEventArgs $event) 
    { 
     if(!empty($this->things)) { 

      $em = $event->getEntityManager(); 

      foreach ($this->things as $thing) { 

       $em->persist($thing); 
      } 

      $this->things = []; 
      $em->flush(); 
     } 
    } 
} 
+1

Ich versuche das, aber ich habe "PHP Fatal error: Maximale Funktion Verschachtelungsebene von '1000' erreicht," –

+2

Detect Bug: Ist sehr wichtig, um "$ this-> things = [];" vor "$ em-> flush();" –

+0

Tut mir leid, es ist mir auch passiert !, Aktualisierung meiner Antwort, danke Igor. – coma