2

postLoadライフサイクルイベントメソッドを実装するエンティティがあります。このメソッドは、条件付きでエンティティを更新し、保存を試みます。次のようなもの:

    /** 
     * @PostLoad 
     */
    public function checkExpiryDate()
    {
        $currentDate = new App_Date();

        // Check the expiry date here
        if($currentDate->getTimestamp() > $this->getDateExpired()->getTimestamp()) {
            $this->Status = "expired";
            $this->ServiceLayer->saveEntity($this);
        }
    }

ただし、次のエラーが発生します。

Call to a member function fetch() on a non-object in Doctrine/ORM/Internal/Hydration/ObjectHydrator.php on line 149

postLoad中にエンティティを保存できないようです。

ObjectHydratorを新しいキーで登録し、新しいクエリ中にハイドレーターを指定することを提案するこのチケットに出くわしました。

ただし、これをより抽象的なレベルで実装するための優れた方法があるかどうか疑問に思っています。postLoadディスパッチ中にクエリが作成されるたびに、新しいObjectHydratorを自動的に登録したいと思います。

さらに、そもそもなぜこれが問題なのかを誰かが簡単に説明できますか?ハイドレーターを使用するとクエリが削除されることがわかりますが、ハイドレーターを再利用しても、新しいクエリを作成するときにこれが問題になる理由はわかりません。

ポインタをありがとう!

4

1 に答える 1

7

EntityManagerこれは、特にサービスレイヤー内で操作を呼び出す場合はサポートされません。

基本的に同じハイドレーターを再利用して内部状態を破壊し、結果セットにハイドレーターを使用している間は使用できなくなるため、考えられるすべての奇妙な競合状態に遭遇します。

これは既知の問題であり、の間にこの初期化ロジックを実際に処理する必要がある場合は回避策があります@PostLoadhttp://www.doctrine-project.org/jira/browse/DDC-1010を参照してください

リスナーを使用してオブジェクトの欠落している依存関係を設定する代わりに、エンティティマネージャーからオブジェクトをフェッチした後、サービスレイヤーを使用してそれを処理することを検討してください。これはとにかく、あなたの例のエンティティのプロキシを持つことを禁止します。

于 2013-02-26T13:46:14.683 に答える