プロジェクトに新しい機能を提供する作業中に、モデルを拡張することにしました。基本クラスを使用し、一般的なメソッドをグループ化し、いくつかのサブクラスをすべて単一のコレクションに保持することにしました。
基本、抽象クラス:
/**
* @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_Image
しApplication_Model_Entry
、内部オブジェクト参照 ($ref
のフィールドDBRef
) がまだ を指してApplication_Model_Image
いたからだと思いましたが、何かおかしいことに気付きました:常に最初のクエリ結果は具体的なクラスの適切なドキュメントであり、残りは基本クラスのプロキシでした。 - データベースから最初のオブジェクトを削除した後、2 番目のオブジェクトは正常になりました。
単一のオブジェクトを表示するページでは、すべてのオブジェクトに対してすべてが正常に機能するため、Zend Framework のページャー クラスが結果を反復処理しているのではないかと考えたので、ページャーをスキップしてクエリから直接オブジェクトをダンプしました。100個の最初の結果のクラスを印刷しましたが、そのうちのいくつかには適切なクラスがありました(ペーストビンのそのリストのスニペット)。DB を調べましたが、データについて特別なことは何もありませんでした (動作しているvs動作していない)。参照に問題があるのではないかと思いましたが、上で書いたように、結果リストの最初にある場合、同じオブジェクトが機能する可能性があります。
アイデアやヒントはありますか?もっとデバッグできますが、Doctrine のコード内のどこを見るべきか教えてもらう必要があります。