3

教義からの永続化と更新にリスナーを使用しています。

唯一の問題は、リスナーが呼び出されると、新しい/現在のエンティティが作成および更新されるため、それ自体が再度呼び出され、2 つのエンティティが作成されることです。

これを止めるために私が考えることができる唯一の方法は、エンティティを永続化(作成)しているかどうかを知るグローバル変数を用意し、更新リスナーを使用しないようにすることです。

私はこれが間違っていることを知っており、それ自体を再度呼び出さずに他のエンティティを更新および作成するリスナーを作成するためのより良い方法が必要です。

4

1 に答える 1

5

doctrineリスナーで再帰ループを回避する1つの方法は、更新/永続化を行う前にイベントマネージャーからリスナーを削除することです。

たとえば、私が取り組んだいくつかのコードでは、次のようなものがあります。

// $evm is the Event Manager grabbed from the Entity Manager that
// is part of the Event passed to the listener function
public function removeThyself($evm)
{
    $evm->removeEventListener(Events::postFlush, $this);
    $evm->removeEventListener(Events::onFlush, $this);
}

public function readdTheyself($evm)
{
    $evm->addEventListener(Events::postFlush, $this);
    $evm->addEventListener(Events::onFlush, $this);
}

これらの関数は、リスナーが登録されているすべてのイベントからイベント リスナーを削除します。

次に、データベースに影響を与えるリスナーから何かを行う前に、これらを呼び出して、イベント リスナーが呼び出されないようにします。例えば

// $em is the Entity Manager, $evm is the Event Manager
$this->removeThyself($evm);
$em->flush($toFlush);
$this->readdTheyself($evm);
于 2013-03-15T17:38:25.943 に答える