2016-12-04 7 views
-1

私は3時間をソーシャルネットワーク上で共有しようとしましたが、PostPersist callbackにいくつかのリンクがあります。しかし、リンクは私に404 errorソーシャルネットワークのページを与えた。私はちょうど、私は、PostPersistのコールバックが発生したときに実際に存在しなかったデータを把握しました。しかし、entity->flush()の後のコントローラでは、私は同じコードを使用し、リンクが正常に動作します。Symfony DoctrineでPostPersistを使用する理由

まさに人々が

/** 
* @ORM\PostPersist 
*/ 

コールバックを使用する理由私は、知っていただきたいと思います。 Doctrine2 documentationから

+3

あなたがPostPersistを使用する理由の質問を行うにはソーシャルネットワークサイトのあなたの物語を持っていますか? PostPersistを使用して、エンティティが作成された後にイベントに基づいてメールを送信します。だから、あなたはあなたのためにそのエンティティを作成する各コントローラ内で、フラッシュするたびにそれを行う必要はありません。 – Kwido

+0

私は同意する、与えられたエンティティのすべての永続に発生するイベントの場合、[カスタムイベントサブスクライバ](http://symfony.com/doc/current/doctrine/event_listeners_subscribers.html)の使用を検討する。彼らはどんなコールバックイベントよりも柔軟性があります。 – ferdynator

+0

@Kwidoソーシャルネットワークの例は、データがPostPersistコールバック中にデータベースにまだ挿入されていないことを説明することです。しかし、flush()の呼び出し後にデータがデータベースに挿入されています。 – user3502626

答えて

2

postPersist - エンティティが永続化された後postPersistイベントがエンティティのために発生します。これは、データベース挿入操作の後に呼び出されます。生成された主キー値は、postPersistイベントで使用できます。

しかし、Doctrine2がデフォルトで暗黙的にトランザクションを呼び出すことを考慮する必要があります。このアプローチでは、エンティティマネージャでflush()を使用するとトランザクションが終了します。そのため、エンティティマネージャをフラッシュしない限り、データベース内のデータを見ることができません。 EntityManager#flush()はトランザクションの開始と終了を示します。それにもかかわらず、トランザクションを明示的に呼び出すことも可能ですが、開始トランザクション、永続オブジェクトおよびコミットトランザクションの間にデータベース内のデータを表示することもできません。

実際、Doctrine2でトランザクションを省略することはできないため、PostPersistイベントが発生した直後にデータが表示されることは期待できません。

これを達成するには、PostFlushイベントを使用する必要があります。私の本当の人生経験で

Postperistは、実施例で使用されます。

  1. 作成されたオブジェクト(すなわち自動翻訳、自動日付、いくつかの特定の関係の更新)
  2. に依存しているデータは、に通知を送信作成します。他のイベント
  3. 送信電子メールが

私はこのことができます願っています。

EDIT
は、あなたのオブジェクトを取得するには、作業の単位を横断する方法の例を見ることができonFlushイベントの例を見てみましょう。 onFlush examples

のみ、特定のオブジェクトで作業するだけで使用します。

if ($entity instanceof Product) { 
     // do something with the YourEntityName 
} 
+0

問題は、Doctrine2は次のように言います:postFlush - postFlushイベントは、フラッシュ操作の終了時に発生します。 **このイベントはライフサイクルコールバックではありません** – user3502626

+0

あなたの事例はOKです。データがデータベースに挿入される前に電子メールを送信することに私は本当に同意しません。 – user3502626

+0

@ user3502626私のEDITを見てください。 –

関連する問題