2013-05-30 8 views
6

Ich habe einen PostUpdate-Listener und ich würde gerne wissen, was die Werte vor dem Update waren und was die Werte für den DB-Eintrag nach dem Update waren. Gibt es eine Möglichkeit, dies in Symfony 2.1 zu tun? Ich habe mir angesehen, was in getUnitOfWork() gespeichert ist, aber es ist leer, da das Update bereits stattgefunden hat.Herausfinden, was über PostUpdate-Listener in Symfony 2.1 geändert wurde

Antwort

7

Gefunden die Lösung here. Was ich brauchte, war tatsächlich Teil von preUpdate(). Ich musste getEntityChangeSet() auf LifecycleEventArgs aufrufen.

Mein Code:

public function preUpdate(Event\LifecycleEventArgs $eventArgs) 
{ 
    $changeArray = $eventArgs->getEntityChangeSet(); 

    //do stuff with the change array 

} 
+4

Meinten Sie 'Preupdate (Ereignis \ PreUpdateEventArgs $ EventArgs)'? Die Methode 'getEntityChangeSet()' existiert nicht in 'LifecycleEventArgs' – Lughino

+1

Die Verbindung ist kaputt, bitte aktualisieren Sie sie wenn möglich. – mboullouz

+0

link Berechtigung verweigert –

-1

Sie example in Lehre Dokumentation finden.

class NeverAliceOnlyBobListener 
{ 
    public function preUpdate(PreUpdateEventArgs $eventArgs) 
    { 
     if ($eventArgs->getEntity() instanceof User) { 
      if ($eventArgs->hasChangedField('name') && $eventArgs->getNewValue('name') == 'Alice') { 
       $eventArgs->setNewValue('name', 'Bob'); 
      } 
     } 
    } 
} 
+0

OP speziell gefragt "Werte waren vor der Aktualisierung und was die Werte für den DB-Eintrag nach der Aktualisierung waren", Ihre Antwort erfordert einen Methodenaufruf für jede Spalte, die hardcodiert werden müsste. – ahonnecke

0

Ihre Entitiy:

/** 
* Order 
* 
* @ORM\Table(name="order") 
* @ORM\Entity() 
* @ORM\EntityListeners(
*  {"\EventListeners\OrderListener"} 
*) 
*/ 
class Order 
{ 
... 

Ihre Zuhörer:

class OrderListener 
{ 
    protected $needsFlush = false; 
    protected $fields = false; 

    public function preUpdate($entity, LifecycleEventArgs $eventArgs) 
    { 
     if (!$this->isCorrectObject($entity)) { 
      return null; 
     } 

     return $this->setFields($entity, $eventArgs); 
    } 


    public function postUpdate($entity, LifecycleEventArgs $eventArgs) 
    { 
     if (!$this->isCorrectObject($entity)) { 
      return null; 
     } 

     foreach ($this->fields as $field => $detail) { 
      echo $field. ' was ' . $detail[0] 
         . ' and is now ' . $detail[1]; 

      //this is where you would save something 
     } 

     $eventArgs->getEntityManager()->flush(); 

     return true; 
    } 

    public function setFields($entity, LifecycleEventArgs $eventArgs) 
    { 
     $this->fields = array_diff_key(
      $eventArgs->getEntityChangeSet(), 
      [ 'modified'=>0 ] 
     ); 

     return true; 
    } 

    public function isCorrectObject($entity) 
    { 
     return $entity instanceof Order; 
    } 
} 
Verwandte Themen