7

के साथ Deserialize मेरे पास एक सार तत्व (मैप किए गए सुपर-) वर्ग है जिसमें कई गुण हैं जिनमें विभिन्न गुण हैं जिन्हें मैं deserialize करना चाहता हूं। मैं मोंगोडीबी और डॉक्टर ओडीएम का उपयोग कर डेटा संग्रहित कर रहा हूं, इसलिए मेरे पास एक भेदभाव करने वाला क्षेत्र भी है जो उप-वर्ग का उपयोग करने वाले सिद्धांत को बताता है (और एक कस्टम "टाइप" प्रॉपर्टी ऑनटॉप भी है जिसका उपयोग यह निर्धारित करने के लिए किया जाता है कि वर्तमान में कौन सी कक्षा संसाधित की जाती है) ।जेएमएस सीरियलाइज़र अमूर्त पैरेंट क्लास

जब मेरे मॉडल को deserializing, मुझे एक अपवाद मिलता है कि मुझे एक अमूर्त वर्ग (संभोग) का एक उदाहरण बनाने के लिए असंभव है - अब मैं सोच रहा हूं कि मैं जेएमएस 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?? 
} 

कोई विचार?

+0

आप एक anwser के रूप में अपने "अद्यतन" कॉपी चाहिए और इस सवाल को चिह्नित करें - इस तरह अन्य जो एक ही समस्या हो सकती है, स्पष्ट रूप से देखेंगे कि इस पृष्ठ पर – loostro

+0

अच्छा बिंदु है। किया हुआ। – con

उत्तर

8

मैंने पाया प्लगइन का टेस्ट निर्देशिका में एक discriminator मानचित्रण, दुर्भाग्य से, यह अभी तक दर्ज नहीं किया गया है: https://github.com/schmittjoh/serializer/blob/master/tests/JMS/Serializer/Tests/Fixtures/Discriminator/Vehicle.php

प्रलेखन अद्यतन किया जाता है http://jmsyst.com/libs/serializer/master/reference/annotations#discriminator

namespace JMS\Serializer\Tests\Fixtures\Discriminator; 

use JMS\Serializer\Annotation as Serializer; 

/** 
* @Serializer\Discriminator(field = "type", map = { 
* "car": "JMS\Serializer\Tests\Fixtures\Discriminator\Car", 
* "moped": "JMS\Serializer\Tests\Fixtures\Discriminator\Moped", 
* }) 
*/ 
abstract class Vehicle 
{ 
    /** @Serializer\Type("integer") */ 
    public $km; 

    public function __construct($km) 
    { 
     $this->km = (integer) $km; 
    } 
} 
संबंधित मुद्दे