11

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

以下は、私がこれを行っている方法を示すためのいくつかのコード スニペットです。

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 は表示されず、スクリプトは関数の最後のダイにかかわらず、完了するまで実行を続けます。

4

1 に答える 1

15

注釈を追加するのを忘れました@HasLifecycleCallbacksか?注釈を使用@PreUpdateして、サービス定義を完全にスキップできます。

/**
 * @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

于 2012-04-28T09:54:35.473 に答える