我创建了一个继承的文档类,请参阅下面的代码。文档仍然存在,但是在获取文档并尝试调用子函数时,我将收到错误调用未定义的方法Proxies__CG __ \ Acme \ ProductBundle \ Document \ ProductBase :: getPriceDefinition()甚至是孩子document有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;
}
子类,SimpleProduct.php
<?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"
}
一般来说,似乎Doctrine似乎不会认识到返回的对象是子类。但是 - 例如,如果我将数据库类型值更改为与“简单”(例如“非简单”)不匹配的其他内容(与“DiscriminatorMap”不匹配),则Doctrine说“注意:未定义的索引:不简单(... )”。
最奇怪的是,只要在父类(ProductBase)中添加getPriceDefinition(),它就会被正确调用并且没有错误。
呃......这是一个很长的问题。无论如何,我只是无法找出这里的问题。是我的getRepository('AcmeProductBundle:Product')调用,还是我的继承定义......答案 0 :(得分:0)
鉴于ProductBase
是抽象的,你有没有理由不将它注释为MappedSuperclass? ODM正在构建一个扩展ProductBase的代理(它在findOneBy()
调用和尝试调用getPriceDefinition()
之间),这在实践中没有意义。代理对象可以与映射类互换使用 - 在这种情况下,代理正在扩展一个永远不应该存在的抽象类。即便如此,似乎这种奇怪的映射导致了鉴别器逻辑中的错误,因为该类型字段应该导致使用SimpleProduct
。
此外,将type
字段的数据库值更改为not-simple
不应导致代码引出PHP通知。我们应该抛出异常。
您是否介意在GitHub repository中为这两个错误打开单独的问题?如果您对此感到满意,那么测试用例也会受到欢迎。