2013-05-30 3 views

答えて

7

解決策を見つけたhere。私が必要としたのは、実際にはpreUpdate()の一部でした。 LifecycleEventArgsでgetEntityChangeSet()を呼び出す必要がありました。

マイコード:

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

    //do stuff with the change array 

} 
+4

あなたが ''更新前(イベントを\ PreUpdateEventArgs $ EventArgs)を意味しましたか?メソッド 'getEntityChangeSet()'が 'LifecycleEventArgs'に存在しません – Lughino

+1

リンクが壊れているので、可能であれば更新してください。 – mboullouz

+0

linkパーミッションが拒否されました –

-1

あなたは教義のマニュアルにexampleを見つけることができます。

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には、「値は更新前であり、DBエントリの値は更新後でした」という特別な質問があります。レスポンスには、ハードコーディングする必要のある各列のメソッド呼び出しが必要です。 – ahonnecke

0

あなたEntitiy:

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

あなたのリスナー:

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; 
    } 
} 
関連する問題