:
postPersist - エンティティが永続化された後postPersistイベントがエンティティのために発生します。これは、データベース挿入操作の後に呼び出されます。生成された主キー値は、postPersistイベントで使用できます。
しかし、Doctrine2がデフォルトで暗黙的にトランザクションを呼び出すことを考慮する必要があります。このアプローチでは、エンティティマネージャでflush()を使用するとトランザクションが終了します。そのため、エンティティマネージャをフラッシュしない限り、データベース内のデータを見ることができません。 EntityManager#flush()はトランザクションの開始と終了を示します。それにもかかわらず、トランザクションを明示的に呼び出すことも可能ですが、開始トランザクション、永続オブジェクトおよびコミットトランザクションの間にデータベース内のデータを表示することもできません。
実際、Doctrine2でトランザクションを省略することはできないため、PostPersistイベントが発生した直後にデータが表示されることは期待できません。
これを達成するには、PostFlushイベントを使用する必要があります。私の本当の人生経験で
Postperistは、実施例で使用されます。
- 作成されたオブジェクト(すなわち自動翻訳、自動日付、いくつかの特定の関係の更新)
- に依存しているデータは、に通知を送信作成します。他のイベント
- 送信電子メールが
私はこのことができます願っています。
EDIT
は、あなたのオブジェクトを取得するには、作業の単位を横断する方法の例を見ることができonFlush
イベントの例を見てみましょう。 onFlush examples
のみ、特定のオブジェクトで作業するだけで使用します。
if ($entity instanceof Product) {
// do something with the YourEntityName
}
あなたがPostPersistを使用する理由の質問を行うにはソーシャルネットワークサイトのあなたの物語を持っていますか? PostPersistを使用して、エンティティが作成された後にイベントに基づいてメールを送信します。だから、あなたはあなたのためにそのエンティティを作成する各コントローラ内で、フラッシュするたびにそれを行う必要はありません。 – Kwido
私は同意する、与えられたエンティティのすべての永続に発生するイベントの場合、[カスタムイベントサブスクライバ](http://symfony.com/doc/current/doctrine/event_listeners_subscribers.html)の使用を検討する。彼らはどんなコールバックイベントよりも柔軟性があります。 – ferdynator
@Kwidoソーシャルネットワークの例は、データがPostPersistコールバック中にデータベースにまだ挿入されていないことを説明することです。しかし、flush()の呼び出し後にデータがデータベースに挿入されています。 – user3502626