4

Doctrine 2 でエンティティの外部からエンティティ イベントを無効にしようとしています。テーブルに新しいレコードを挿入するたびに、prePersist アノテーションを使用してメソッドに実装されているファイル操作を実行する必要はほとんどありません。ただし、いくつかのデータ フィクスチャを実行し、テストの一部としてファイル操作部分をスキップする必要もあります。基本的に、エンティティ内で何も変更せずに、エンティティ マネージャを介してすべての prePersist イベントを無効にすることが可能かどうかを尋ねています。

前もって感謝します。

4

3 に答える 3

7

JimTheDev のソリューションは実際にうまく機能します。
私のテストクラスの1つに、次のメソッドがあります。

private function persistSkippingEvents($object, $manager)
{
    // temporarily stores lifecycle events
    $events = $manager->getClassMetadata(get_class($object))->lifecycleCallbacks;

    // removes lifecycle events
    $manager->getClassMetadata(get_class($object))->setLifecycleCallbacks(array());
    $manager->persist($object);
    $manager->getClassMetadata(get_class($object))->setLifecycleCallbacks($events);
}
于 2015-04-27T10:04:57.267 に答える
2

ORM API では、ライフサイクル コールバックを無効にすることはできません。

この問題は、エンティティのライフサイクル コールバックが呼び出された後に外部リスナーが呼び出されるため、(外部リスナー/サブスクライバーによって設定された) コールバックを無効にする一時的なプロパティでさえ機能しないという事実に起因します。

代わりに、ロジックをエンティティから外部リスナー/サブスクライバーに移動することを検討してください。そうすることで、柔軟性が大幅に向上し、リスナー/サブスクライバー自体の内部ステータスを再利用することで、説明した動作をオフにすることができます。

// ...

public function prePersist(LifecycleEventArgs $args)
{
    if ($this->skipCondition($args->getEntity()) {
        return;
    }

    $this->manipulate($args->getEntity());
}

// ...
于 2013-03-01T11:40:28.890 に答える