2016-03-28 7 views
0

doctrine EntityListenerをセットアップしました。私はpostRemoveイベントでいくつかのコードを実行する必要があります。しかし:Doctrine EntityListener postRemoveがトランザクションでラップされないようにする

public function postRemove(Image $image, LifecycleEventArgs $event) 
{ 
    $isActive = $event->getEntityManager()->getConnection()->isTransactionActive(); 
    dump($isActive); 
} 

は常にをダンプします。

私がpostRemove()メソッドの内部でコミットしても、フラッシュしても問題ありません。私はpreRemove()でトランザクションを開始し、postRemove()でコミットしようとしましたが、それは役に立ちません。

質問:DoctrineがpostRemove()をトランザクションにラップしないようにする方法はありますか?そうでない場合は、トランザクションの対象外となるコードを実行するための最良の方法は何ですか?最終的に起こる限り、直ちに起こるかカーネルで終了するかは気にしません。

私はEntityListenerでデストラクタメソッドを作成し、リスナーが破壊するときにコードを実行する考えがありますが、どれくらいの信頼性があるかはわかりません。たぶん、他の(より良い)オプションがありますか?

ありがとうございました!

答えて

1

postRemoveイベントでやりたいことではない、あなたがフラッシュしたい、あるいは持続したいと思うようなサウンド。ドキュメントから

:ここで

変更は、データベース内の永続性、 に関連していないが、あなたは 非マッピングされたフィールド、ロギングやのような、非永続の項目を変更するためにこれらのイベントを使用することができますDoctrineによって直接マップされた ではない関連クラスさえも含みます。

このイベントは、entitymanagerで操作を実行するためのものではありません。

代わりにonFlush listenerを使用してください。削除されたエンティティのインスタンスをキャッチし、適切なアクションを実行できます。ドキュメントはEntityManagerの::フラッシュ()onFlush内部イベントを呼び出すことも悪い考えであることを言う

http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/events.html#onflush

+0

セクション特に次の制限事項がonFlushイベントに適用され、慎重にマニュアルを参照してください。私の問題は次のとおりです。新しいイメージを永続化する場合、そのイメージのいくつかのフォーマットを作成し、それらのフォーマットをファイルシステムに保存し、別のテーブル内のそれらのファイルへの参照(行)を持たせます。ファイルシステムとデータベースの間に矛盾が生じないようにするために、私はすべてのfs書き込み操作後にフラッシュする必要があります。しかし、私はpre/postPersistでもonFlushでもフラッシュできないことが判明しましたか? – Karolis

+0

EntityListener内でこの作業をすべて完了したのは結局悪い考えですか? – Karolis

+0

あなたはフラッシュを呼び出す必要はありません、ユニットワークを使用して変更を行い、永続化してから、変更セットを再計算してください。ここで私が答えた別の質問からの例です:http://stackoverflow.com/questions/30734814/persisting-other-entities-inside-preupdate-of-doctrine-entity-listener/30741471#30741471 - これは、私はそれを使用してライブ制作システム。 – Richard

関連する問題