13

私は Symfony2 が初めてで、prePersist と preUpdate イベントの違いを知りたいです。レコードを「永続化」する前に prePersist が「起動」しているように見えますが、preUpdate はいつ起動しますか?

4

3 に答える 3

32

これらはどちらもSymfonyの一部ではありません。それらはDoctrine2の一部です。prePersistは、エンティティが最初に永続化された時点で起動します。オブジェクトを永続化するということは、フラッシュするまで実際にはデータベースに挿入されない場合でも、DoctrineentityManagerによって管理されることを意味します。

preUpdateは、更新されようとしている既存のオブジェクトの対応するイベントです。既存のオブジェクトは、照会された時点でentityManagerによってすでに管理されているため、同等の永続化イベントはありません。基本的に、既存のオブジェクトが変更され、フラッシュが呼び出されたときに発生します。

つまり、オブジェクトで何も変更しなかった場合、PreUpdateは実行されません。

そうは言っても、これらは「挿入の直前」と「更新の直前」に発生していると考えることができます。

これらには2つの形式もあります。 ライフサイクルコールバック。エンティティに直接注釈を付けて、エンティティ内のメソッドとして追加できますが、エンティティの属性にのみアクセスできます。これらは、タイムスタンプ、特定の標準への文字列の準拠、派生属性の生成などの単純な操作に適しています。

また、entityManagerに登録する必要があり、データベーストリガーで期待される前/後データのタイプのイベントデータにアクセスできる 真のイベントリスナーもあります。

Doctrineバージョン2.4では、ライフサイクルコールバックに対してもイベントデータが追加されたことに注意してください。これにより、以前はイベントリスナーを使用するために必要だったのと同じ種類のことをはるかに簡単に実行できるようになりました。

于 2013-01-15T20:05:52.520 に答える
18

また、注目に値する:

-エンティティの値が変更されていない場合、 はPreUpdateトリガーされません。

したがって、フォームが保存されるたびに変更タイムスタンプを更新するためにこれに頼ることはできません。1 つのページにフォームのコレクションがあり、ユーザーが含まれているサブフォーム コレクションのいくつかのフィールドを更新した可能性がある場合、これは特に注意が必要です。更新されたエンティティは をトリガーしますPreUpdateが、プライマリ フォーム エンティティは、所有PreUpdateフィールドが更新されない限り をトリガーしません。

-と の両方複数のライフサイクル コールバック アノテーションを設定できます。PrePersistPreUpdate

たとえば、レコードが作成されたときと更新されたときに変更タイムスタンプを設定したい場合は、エンティティの同じ関数に両方の注釈を追加できます。

/**
 * @ORM\PreUpdate
 * @ORM\PrePersist
 */
public function setTimeModValue() {
    $this->timeMod = time();
}
于 2014-06-14T01:16:52.007 に答える
5

ここから: http://docs.doctrine-project.org/en/2.0.x/reference/events.html#lifecycle-events

prePersist - prePersist イベントは、特定のエンティティに対してそれぞれの EntityManager 永続化操作が実行される前に、そのエンティティに対して発生します。

preUpdate - preUpdate イベントは、エンティティ データに対するデータベース更新操作の前に発生します。DQL UPDATE ステートメントでは呼び出されません。

また、これは特に Symfony ではなく、Doctrine 用であることに注意してください。

于 2013-01-15T19:53:22.260 に答える