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でデストラクタメソッドを作成し、リスナーが破壊するときにコードを実行する考えがありますが、どれくらいの信頼性があるかはわかりません。たぶん、他の(より良い)オプションがありますか?
ありがとうございました!
セクション特に次の制限事項がonFlushイベントに適用され、慎重にマニュアルを参照してください。私の問題は次のとおりです。新しいイメージを永続化する場合、そのイメージのいくつかのフォーマットを作成し、それらのフォーマットをファイルシステムに保存し、別のテーブル内のそれらのファイルへの参照(行)を持たせます。ファイルシステムとデータベースの間に矛盾が生じないようにするために、私はすべてのfs書き込み操作後にフラッシュする必要があります。しかし、私はpre/postPersistでもonFlushでもフラッシュできないことが判明しましたか? – Karolis
EntityListener内でこの作業をすべて完了したのは結局悪い考えですか? – Karolis
あなたはフラッシュを呼び出す必要はありません、ユニットワークを使用して変更を行い、永続化してから、変更セットを再計算してください。ここで私が答えた別の質問からの例です:http://stackoverflow.com/questions/30734814/persisting-other-entities-inside-preupdate-of-doctrine-entity-listener/30741471#30741471 - これは、私はそれを使用してライブ制作システム。 – Richard