1

プロジェクトに新しい機能を提供する作業中に、モデルを拡張することにしました。基本クラスを使用し、一般的なメソッドをグループ化し、いくつかのサブクラスをすべて単一のコレクションに保持することにしました。

基本、抽象クラス:

/**
* @MongoDB\Document(repositoryClass="EntryRepository")
* @MongoDB\MappedSuperclass
* @MongoDB\InheritanceType("SINGLE_COLLECTION")
* @MongoDB\DiscriminatorField(fieldName="type")
* @MongoDB\DiscriminatorMap({"entry"="Application_Model_Entry", "image"="Application_Model_Image", "movie"="Application_Model_Movie"})
*/
abstract class Application_Model_Entry
{
    abstract function foo();
}

いくつかの具体的なクラス(似たようなものはほとんどありませんが、いくつかは抽象的です):

<?php
/** @MongoDB\Document */
class Application_Model_Image extends Application_Model_Entry
{
    function foo()
    {
        return 'foo';
    }
}

その遷移の後、インデックス ページを開くと、エラーが表示されました。Doctrine によって返されたオブジェクトが基本クラスのプロキシであるため、PHP が抽象メソッドを呼び出そうとしていました。コレクションの名前を から に変更Application_Model_ImageApplication_Model_Entry、内部オブジェクト参照 ($refのフィールドDBRef) がまだ を指してApplication_Model_Imageいたからだと思いましたが、何かおかしいことに気付きました:常に最初のクエリ結果は具体的なクラスの適切なドキュメントであり、残りは基本クラスのプロキシでした。 - データベースから最初のオブジェクトを削除した後、2 番目のオブジェクトは正常になりました。

単一のオブジェクトを表示するページでは、すべてのオブジェクトに対してすべてが正常に機能するため、Zend Framework のページャー クラスが結果を反復処理しているのではないかと考えたので、ページャーをスキップしてクエリから直接オブジェクトをダンプしました。100個の最初の結果のクラスを印刷しましたが、そのうちのいくつかには適切なクラスがありました(ペーストビンのそのリストのスニペット)。DB を調べましたが、データについて特別なことは何もありませんでした (動作しているvs動作していない)。参照に問題があるのではないかと思いましたが、上で書いたように、結果リストの最初にある場合、同じオブジェクトが機能する可能性があります。

アイデアやヒントはありますか?もっとデバッグできますが、Doctrine のコード内のどこを見るべきか教えてもらう必要があります。

4

1 に答える 1

5

上記の jmikola のコメントに従って、Document注釈を削除し、すべてがスムーズに機能し始めました。奇妙な結果により、間違った場所でエラーを探すようになりましたが、ありがたいことに、ここでヒントを得ることができました。

後世のために:

  • Document注釈は具象クラス用です
  • MappedSuperclass注釈は抽象クラス用です
  • クエリ結果でプロキシ クラス オブジェクトを受け取った場合、その部門で取り違えが発生している可能性があります
  • Document注釈がなくても、識別子のフィールド/値を示すことができます。
于 2013-02-25T19:52:52.543 に答える