2016-07-08 3 views
1

これは私の最初の質問ですので、私にご負担ください。イベントリスナーを作成して別のデータベーステーブルを更新する

Sonataを使用して注文テーブル内で注文を作成または更新するときに、ログテーブルを更新するためにpostPersistイベントリスナーを実装する方法を教えてください。

私は、新しい注文を作成するとすぐprePersistを使用して同じデータベーステーブルに情報を追加する方法を理解しています。 (次のコードスニペットを参照してください)

public function prePersist(LifecycleEventArgs $args) 
{ 
    $order = $args->getEntity(); 

    if ($order instanceof PmodOrder) { 
     $user = $this->serviceContainer->get('security.token_storage')->getToken()->getUser(); 

     if ($user) { 
      $order->setCreatedBy($user); 
      $order->setCreatedAt(new \DateTime(date('Y-m-d H:i:s'))); 
     } 
    } 
} 

しかし、私は完全に別のテーブルを更新するとき、それは同じエンティティではありませんので、私は、これを行うだろうか理解していません。

注文が作成された瞬間(私は思うが)、postPersistはその注文IDといくつかの追加情報で別のテーブルを更新する必要があります。

私はこのような行の間に何かを考えます。

私は忙しい現在の注文を取得する方法がわかりません。そして、ユーザーが注文を変更したときにsetActionが何か他のものになる方法。たとえば、「編集済み」または「承認済」などです。私は何かを読んでいない限り、運がないソナタの資料を通っています。

私はSonataを使用することを覚えておいてください。さもなければ、これは私自身のController Actionsで実装するのが簡単でした。

答えて

1

オーダーのログを作成/更新するリスナーをエンティティに直接追加することができます。

最初に、リスナークラスを作成します。次に

use Doctrine\ORM\Event\LifecycleEventArgs; 

class OrderListener 
{ 

    public function postPersist(Order $order, LifecycleEventArgs $event) 
    { 
     // for example 
     // if you want to store the date creation : 
     if($order->getId() == null) 
     { 
      $order->setDateCreate(new \DateTime('now')); 
     } 
     // if you want to store the last update date : 
     $order->setDateUpdate(new \DateTime('now')); 

     //... or whatever you want to store... 
    } 
} 

service.ymlに登録:

order_listener: 
    class: YOUR\NAMESPACE\OrderListener 
    tags: 
     - { name: doctrine.orm.entity_listener } 

最後に、(ここでは注釈付き)リスナーにあなたのエンティティをリンク:

/** 
* @ORM\EntityListener("YOUR\NAMESPACE\OrderListener") 
*/ 
class Order 
{ 

    ... 

} 
+0

ありがとうございました。私は今それを試してみるつもりです(週末にはテストできませんでした)。私はログが完全な他のエンティティであるという事実をどうやってそれにするのかをかなり理解していません。 –

+0

リスナーは新しいエンティティではありません。リスナーを作成すると、リスナー(これはここではOrder)をリスナーにリンクするために、エンティティの上部に注釈を追加するだけです(私の答えの最後のコードブロックを参照)。しかし、すべての変更情報を格納する新しいエンティティを追加したい場合は、(たとえばOrderLogクラスのように)行うことができます。 –

+0

ありがとう、私は今それを得る。 –

関連する問題