Я создал унаследованный класс документа, см. код ниже. Документы сохраняются нормально, но при извлечении документа и попытке вызвать дочернюю функцию я получаю сообщение об ошибке Вызов неопределенного метода Proxies__CG__\Acme\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;
}
Дочерний класс 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, Доктрина говорит: «Уведомление: неопределенный индекс: не простой (... )".
И что самое странное, как только я добавляю getPriceDefinition() в родительский класс (ProductBase), он вызывается корректно и без ошибок.
Эээ... это был длинный вопрос. Во всяком случае, я просто не могу понять, в чем здесь проблема. Это мой вызов getRepository('AcmeProductBundle:Product') или мои определения наследования...