Doctrine orm 为什么要在原则中调用函数';的代理对象指向父对象而不是继承的子对象?

Doctrine orm 为什么要在原则中调用函数';的代理对象指向父对象而不是继承的子对象?,doctrine-orm,doctrine-odm,Doctrine Orm,Doctrine Odm,我已经创建了一个继承的文档类,请参见下面的代码。文档仍然可以正常保存,但在获取文档并尝试调用子函数时,我将得到一个错误调用未定义的方法代理\uuuuucg\uuuucme\ProductBundle\document\ProductBase::getPriceDefinition()即使子文档也有getPriceDefinition()函数。代理还指向ProductBase,而不是SimpleProduct 父类ProductBase.php <?php namespace Acme\Pr

我已经创建了一个继承的文档类,请参见下面的代码。文档仍然可以正常保存,但在获取文档并尝试调用子函数时,我将得到一个错误调用未定义的方法代理\uuuuucg\uuuucme\ProductBundle\document\ProductBase::getPriceDefinition()即使子文档也有getPriceDefinition()函数。代理还指向ProductBase,而不是SimpleProduct

父类ProductBase.php

<?php
namespace Acme\ProductBundle\Document;

use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;

/**
 * @MongoDB\Document
 * @MongoDB\InheritanceType("SINGLE_COLLECTION")
 * @MongoDB\DiscriminatorField(fieldName="type")
 * @MongoDB\DiscriminatorMap({"simple"="SimpleProduct"})
 */
abstract class ProductBase
{   
    /**
     * @MongoDB\Id;
     */
    protected $_id;

    /**
     * @MongoDB\String
     */
    public $comment;
}
最后是数据库中的文档(正确保存上述文档)

一般来说,这似乎是因为条令不承认返回的对象是一个子类。但是-例如,如果我将数据库类型值更改为与DiscriminatorMap不匹配的“simple”(例如“NotSimple”)以外的其他值,则原则会说“注意:未定义索引:NotSimple(…)”

最奇怪的是,只要我在父类(ProductBase)中添加getPriceDefinition(),它就会被正确地调用,而且不会出错


嗯。。。这是一个很长的问题。不管怎样,我就是找不出这里有什么问题。是我的getRepository('AcmeProductBundle:Product')调用,还是我的继承定义…

鉴于
ProductBase
是抽象的,有什么理由不将其注释为抽象的?ODM正在构造一个扩展ProductBase的代理(它在
findOneBy()
调用和尝试调用
getPriceDefinition()
之间进行扩展),这在实践中没有意义。代理对象意味着可以与映射类互换使用——在本例中,代理扩展了一个抽象类,该抽象类不应该单独存在。即便如此,这种奇怪的映射似乎导致了鉴别器逻辑中的错误,因为该类型字段应该导致使用
SimpleProduct

另外,将
type
字段的数据库值更改为
not simple
不应导致代码引起PHP注意。我们应该抛出一个异常


您介意在中为这两个bug分别打开一个问题吗?如果您能胜任,也欢迎失败的测试用例。

嗨!谢谢你的回复。我将尽快打开这些问题,并随时更新此问题/答案。谢谢最后——半年后——我打开了问题并添加了测试用例:针对抽象类问题,针对缺少的异常。
<?php
namespace Acme\ProductBundle\Document;

use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;

/**
 * @MongoDB\Document
 */
class SimpleProduct extends ProductBase
{

    /**
     * @var PriceDefinition
     * @MongoDB\EmbedOne(targetDocument="PriceDefinition") 
     */
    protected $priceDefinition;

    public function getPriceDefinition() {
        return $this->priceDefinition;
    }
}
$product = $this->dm->getRepository('AcmeProductBundle:Product')->findOneBy(array('_id' => $productId));
$priceDefinition = $product->getPriceDefinition(); // The error is thrown here
{
  "_id": ObjectId("5006d7b76803fa9403000007"),
  "priceDefinition": {
     "referenceValue": 1000000,
     "currency": "iso: EUR",
     "taxBehavior": "fi_vat_a",
     "isGrossPrice": false
  },
  "type": "simple"
}