私は非直列化したい異なるプロパティを持ついくつかの子を持つ抽象親(マップされたスーパー)クラスを持っています。 私はMongoDBとDoctrine ODMを使ってデータを保管していますので、どのサブクラスが使用されているかを教えるdiscriminatorフィールドもあります(現在どのクラスが処理されているかを決定するために他の場所で使用されるカスタム "type"プロパティontopもあります) 。JMSシリアライザ抽象親クラスで非直列化
私のモデルをデシリアライズすると、抽象クラスのインスタンスを作成できないという例外があります。なぜ私はカスタムのtype
インスタンス変数を使用するのですか?私はdoctrineのdiscriminatorフィールドマッピングへのアクセス権がないためです)。
私は正常にpreDeserializeEvent
にフックすることができます - それで、いくつかのスイッチ/ケースをそこに作ることは可能でしょうか?
短い(抽象クラス)での私のモデル:
<?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..
?>
別のテストはにしたサブクラスの
<?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..
}
?>
一つ 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??
}
に更新されhttps://github.com/schmittjoh/serializer/blob/master/tests/JMS/Serializer/Tests/Fixtures/Discriminator/Vehicle.php
あなたがanwserとしてあなたの「更新」をコピーする必要がありますこの問題を解決するには、同じ問題を抱えている可能性がある他の人が、このページに実際の解決策があることが明確に分かるでしょう。 – loostro
良い点。完了しました。 – con