11

取得した例外の「おかげで」この問題を検出しました。

Catchable Fatal Error: Argument 3 passed to
Doctrine\ORM\Event\PreUpdateEventArgs::__construct() 
must be an array, null given, called in 
/.../vendor/doctrine/lib/Doctrine/ORM/UnitOfWork.php on line 804 
and defined in
/.../vendor/doctrine/lib/Doctrine/ORM/Event/PreUpdateEventArgs.php line 28

特定のロジックを必要とするプロジェクトに取り組んでいます:エンティティ
orderフィールドが変更された場合、親エンティティのbookフィールドを更新する必要があります(このフィールドにより、書店の本の順序が変更されたかどうかを知ることができます)。books_order_modified_atbookstore

本の順序を変更する可能性のあるコードの場所がたくさんあるので、イベント リスナーで行うことにしました。

イベントから関連エンティティを更新する方法が見つからなかったので、関連エンティティを更新するようにイベントpreUpdateに指示するために使用するリスナー クラスにプライベート フィールドがあります。postUpdatebookstore

私の問題は、そうするとエンティティのpreUpdateイベントが発生することです。 変更セットを確認すると、フィールドのみが含まれていますが、前後で同じ値になっています。book
modified_at

誰かが問題を解決する別のアイデアを持っている場合 - 素晴らしい。

preUpdateそうでない場合-イベントでフラッシュが呼び出されたときにイベントが発生しないようにするにはどうすればよいですpostUpdateか??

4

4 に答える 4

6

実際、これはドクトリン Doctrine Issue DDC-2726の問題です。リスナーのフラッシュの後にエンティティ マネージャーに clear 呼び出しを追加することで解決したため、そのコンストラクターの 3 番目の引数 (実際には entityChangeSets) が書き換えられます。

于 2014-05-15T09:07:36.207 に答える
1

エンティティ内の を更新してmodified_at、doctrine に処理させるのはどうですか? 本の setOrder メソッドを変更して、次のように BookOrder エンティティを更新します。

class Book {
    public function setOrder($order) {
        // modify book
        $this->bookOrder->updateModifiedAt();
    }
}

もちろん、BookOrder は modifiedAt を実装する必要があります。

class BookOrder {
    public function updateModifiedAt() {
        $this->modifiedAt = new \DateTime();
    }
}

Datetime に他のクラスを使用する場合は、もちろんこのコードを変更する必要があります。

Doctrine は BookOrder が変更されたことを認識し、イベントリスナーを使用する必要なく更新する必要があります。

于 2012-07-07T14:11:27.277 に答える
0

DoctrineExtensionsBundle からDoctrineに Timestampable 拡張機能を使用することをお勧めします。

created_atそれを使用することで、またはmodified_at値を設定する必要はありません。この拡張機能はそれを自動的に行います。modified_at特定のフィールドが変更された場合にのみ設定できます。を参照してください。

この拡張機能のようなものを書いていると思います。したがって、これはすでに行われているため、それを行う必要はありません:)

于 2012-07-07T16:45:21.260 に答える