JMS Serializer Mit abstrakter übergeordneter Klasse deserialisieren

Ich habe eine abstrakte Elternklasse (zugeordnete Superklasse), die mehrere Kinder mit unterschiedlichen Eigenschaften hat, die ich deserialisieren möchte. Ich speichere die Daten mit MongoDB und Doctrine ODM, habe also auch ein Unterscheidungsfeld, das angibt, welche Unterklasse verwendet wird (und habe auch eine benutzerdefinierte "type" -Eigenschaft, die an anderer Stelle verwendet wird, um zu bestimmen, welche Klasse gerade verarbeitet wird).

Beim Deserialisieren meines Modells wird eine Ausnahme gemeldet, die besagt, dass es unmöglich ist, eine Instanz einer abstrakten Klasse (natürlich) zu erstellen. Jetzt frage ich mich, wie ich dem JMS-Deserializer mitteilen kann, welche geerbte Klasse verwendet werden soll (aus diesem Grund verwende ich sie) ein Brauchtype Instanzvariable zum Beispiel - weil ich keinen Zugriff auf die Diskriminatorfeldzuordnung der Doktrin habe).

Ich kann mich erfolgreich einhängenpreDeserializeEvent- also ist es vielleicht möglich, dort einige Schalter / Fälle zu machen (oder die zu verwenden)?

Mein Model in Kürze (abstrakte Klasse):

<?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..
}

?>

Eine der Unterklassen

<?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..
?>

Ein weiterer Test war zunicht machen die Modulklasse abstrakt und zum Erstellen einer benutzerdefinierten statischen Methode

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

irgendwelche Ideen?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage