2012-04-27 13 views
9

このチュートリアルの指示に従っています:http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.htmlと、エンティティの挿入または更新時にDoctrineが送出するイベントをリッスンする単純なリスナーを作成しました。 preInsertイベントとpostInsertイベントは正常に動作し、新しいエンティティの作成時に送出されます。ただし、preUpdateとpostUpdateは、何に関係なくエンティティの更新時に呼び出されることはありません。同じことがonFlushにも当てはまります。副作用として、私は基本的なCRUD操作をサポートするコンソール生成コントローラを持っていて、そのまま残しています。doctrine 2でpreUpdateイベントとpostUpdateイベントがトリガーされていません

以下は、私がこれを行う方法を示すためのコードスニペットです。

config.yml

annotation.listener: 
    class: City\AnnotatorBundle\Listener\AnnotationListener 
    tags: 
     - { name: doctrine.event_listener, event: postUpdate} 

リスナーの実装(私は他の機能を省略しており、簡潔の目的のためにのみpostUpdateを左)

class AnnotationListener 
{ 

    public function postUpdate(LifecycleEventArgs $args) 
    { 
     $entity=$args->getEntity(); 

     echo $entity->getId(); 
     die; 
    } 
} 

は、エンティティIDが表示されることはありませんし、スクリプトは継続関数の最後にのダイのにもかかわらず、実行が完了するまで実行されます。

答えて

13

@HasLifecycleCallbacks annotaionを追加するのを忘れましたか?注釈とサービス定義を完全にスキップすると​​を使用できます。私の意見で

/** 
* @ORM\Entity 
* @ORM\HasLifecycleCallbacks 
*/ 
class YouEntity 
{ 

    /** 
    * @ORM\PrePersist() 
    * @ORM\PreUpdate() 
    */ 
    public function preUpdate(){ 
     // .... your pre-update logic here 
    } 
    .... 
} 

イベントを取り付けるこの方法は、あなたが新しいサービスやリスナー明示的を定義する必要はありませんとしてはるかに簡単です。また、このメソッドはエンティティ内の場所であるため、更新中のデータに直接アクセスできます。しかし http://symfony.com/doc/master/cookbook/doctrine/file_uploads.html#using-lifecycle-callbacks

+2

真を...:

さて、欠点は、あなたのモデルとロジックを混ぜていることであり、それが可能であれば避けるべきである何かで...

あなたがここにライフサイクルコールバックについての詳細を読むことができます私は他のエンティティとエンティティマネージャ自身、そして場合によっては他のサービスを使用しなければならないので、良い考えではありません。とにかく、問題は今解決されたようです。私はSymfonyの最新バージョンに更新し、キャッシュをクリアして、すべて動作しています。 – tomor

+0

ああ、もしあなたが他のサービス/エンティティを使っているのであれば、この方法には意味がありません:) –

関連する問題