Сериализатор JMS десериализуется с абстрактным родительским классом

У меня есть абстрактный родительский (сопоставленный супер-) класс, в котором есть несколько детей с различными свойствами, которые я хотел бы десериализовать. Я храню данные, используя MongoDB и Doctrine ODM, поэтому у меня также есть поле дискриминатора, которое сообщает доктрине, какой подкласс используется (а также имеет собственное свойство типа «ontop», которое используется в другом месте, чтобы определить, какой класс обрабатывается в настоящее время).

При десериализации моей модели я получаю исключение, говорящее мне, что невозможно создать экземпляр абстрактного класса (ofcourse) - теперь мне интересно, как я могу сказать 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..
?>

Еще один тест былне делать Модульный класс рефератов и создание собственного статического метода

/**
 *
 * @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??
}

есть идеи?

Ответы на вопрос(1)

Ваш ответ на вопрос