我有一个抽象父(映射的超)类,它有几个具有不同属性的子类,我想反序列化它们。我使用 MongoDB 和 Doctrine ODM 存储数据,所以我还有一个鉴别器字段,它告诉教义使用哪个子类(并且还有一个自定义的“类型”属性在其他地方用于确定当前正在处理的类)。
在反序列化我的模型时,我收到一个异常,告诉我不可能创建抽象类的实例(当然) - 现在我想知道如何告诉 JMS Deserializer 它应该使用哪个继承的类(这就是我使用的原因例如自定义type
实例变量 - 因为我无法访问学说的鉴别器字段映射)。
我可以成功连接到preDeserializeEvent
- 所以也许可以在那里(或使用)制作一些开关/案例?
简而言之我的模型(抽象类):
<?php
namespace VBCMS\Bundle\AdminBundle\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
use JMS\Serializer\Annotation as Serializer;
/**
* abstract Class Module
* @Serializer\AccessType("public_method")
* @MongoDB\MappedSuperclass
* @MongoDB\InheritanceType("SINGLE_COLLECTION")
* @MongoDB\DiscriminatorField(fieldName="_discriminator_field")
* @MongoDB\DiscriminatorMap({
* "module"="Module",
* "text_module"="TextModule",
* "menu_module"="MenuModule",
* "image_module"="ImageModule"
* })
*/
abstract class Module {
const TYPE_MODULE_TEXT = 'module.text';
const TYPE_MODULE_MENU = 'module.menu';
const TYPE_MODULE_MEDIA_ITEM = 'module.media.item';
/**
* @Serializer\Type("string")
* @MongoDB\Field(type="string")
* @var String
*/
protected $type;
/**
* @Serializer\Type("boolean")
* @MongoDB\Field(type="boolean")
* @var boolean
*/
protected $visible;
// getter/setter methods etc..
}
?>
子类之一
<?php
namespace VBCMS\Bundle\AdminBundle\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
use JMS\Serializer\Annotation as Serializer;
/**
* Class TextModule
* @package VBCMS\Bundle\AdminBundle\Document
* @Serializer\AccessType("public_method")
* @MongoDB\EmbeddedDocument
*/
class TextModule extends Module {
const TEXT_TYPE_SPLASH_HEADLINE = 'splashscreen.headline';
const TEXT_TYPE_SPLASH_SUBLINE = 'splashscreen.subline';
/**
* the actual text
*
* @var string
* @Serializer\Type("string")
* @MongoDB\Field(type="string")
*/
protected $text;
/**
* how it is called in the admin interface
*
* @var string
* @Serializer\Type("string")
* @MongoDB\Field(type="string")
*/
protected $label;
/**
* @var string
* @Serializer\Type("string")
* @MongoDB\Field(type="string")
*/
protected $textType;
// getter/setter methods etc..
?>
另一个测试是不使Module 类抽象并创建自定义静态方法
/**
*
* @Serializer\HandlerCallback("json", direction="deserialization")
* @param JsonDeserializationVisitor $visitor
*/
public static function deserializeToObject(JsonDeserializationVisitor $visitor)
{
// modify visitor somehow to return an instance of the desired inherited module class??
}
有任何想法吗?