在为我的项目提供新功能的工作中,我决定扩展模型。我决定使用基类,将常用方法分组,只有很少的子类,都保存在一个集合中。
基类,抽象类:
/**
* @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';
}
}
在那次转换之后,我打开了我的索引页面,并出现了一个错误 - PHP 试图调用一个抽象方法,因为 Doctrine 返回的对象是基类的代理。我以为是因为我将集合从 to 重命名,而Application_Model_Image
内部对象Application_Model_Entry
引用($ref
字段 of DBRef
)仍然指向- 在我从数据库中删除第一个对象后,第二个对象变得很好。Application_Model_Image
在一个显示单个对象的页面上,对于所有对象,一切正常,所以我认为这可能是 Zend Framework 的寻呼机类迭代结果的原因,所以我跳过了寻呼机并直接从查询中转储了对象。我打印了 100 个第一个结果的类,其中一些具有适当的类(pastebin 上该列表的片段)。我查看了数据库,但我发现数据没有什么特别之处(工作与不工作)。我认为引用可能有问题,但正如我在上面所写的,如果同一个对象在结果列表中首先出现,它可能会起作用。
有什么想法或提示吗?我可以调试更多,但我需要被告知在哪里查看 Doctrine 的代码。