2012-10-05 11 views
8

मुझे समूहों का उपयोग करके कई संबंधों के साथ धारावाहिक इकाई के साथ एक समस्या है। मुझे इस तरह से संबंधित इकाइयों को क्रमबद्ध करने में समस्या है। उत्पाद और संबंधित तत्व:संबंधों के साथ इकाइयों में JMSSerializerBundle serialization समूह

चलो कहते हैं कि मैं दो संस्थाओं करते हैं।

/** 
* 
* @Serializer\ExclusionPolicy("none") 
*/ 
class Product { 

    /** 
    * Primary key 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * 
    * @Serializer\Groups({"list","details"}) 
    * @Serializer\Type("integer") 
    */ 
    protected $id; 

    /** 
    * @Serializer\Groups({"list","details"}) 
    * @Serializer\Type("string") 
    */ 
    protected $name; 

    /** 
    * @ORM\Column(name="description", type="string", length=4096, nullable=true) 
    * 
    * @Serializer\Groups({"details"}) 
    * @Serializer\Type("string") 
    */ 
    protected $description; 

    /** 
    * @var ArrayCollection 
    * 
    * @ORM\OneToMany(targetEntity="Madden\ProjectBundle\Entity\ProjectResource", mappedBy="project") 
    * @Serializer\Groups({"details"}) 
    * @Serializer\Type("ArrayCollection<Element>") 
    */ 
    protected $details1; 

    /** 
    * Relation to project tasks 
    * @ORM\OneToMany(targetEntity="Madden\ProjectBundle\Entity\ProjectTask", mappedBy="project") 
    * @Serializer\Exclude() 
    * @Serializer\Type("ArrayCollection<Element>") 
    */ 
    protected $details2; 

    ... 

} 

तत्व इकाई एक समान संरचना है:

/** 
* 
* @Serializer\ExclusionPolicy("none") 
*/ 
class Element { 

    /** 
    * Primary key 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * 
    * @Serializer\Groups({"list","details"}) 
    * @Serializer\Type("integer") 
    */ 
    protected $id; 

    /** 
    * @Serializer\Groups({"list","details"}) 
    * @Serializer\Type("string") 
    */ 
    protected $name; 

    /** 
    * @ORM\Column(name="description", type="string", length=4096, nullable=true) 
    * 
    * @Serializer\Groups({"details"}) 
    * @Serializer\Type("string") 
    */ 
    protected $description; 

    ... 
} 

मेरे समस्या यह है कि जब मैं के साथ 'विवरण' समूह इकाई उत्पाद serializing कर रहा हूँ मैं सिर्फ आईडी तत्वों के क्रमानुसार करने चाहते हैं, लेकिन है आप इकाई को देखने के रूप में ने समान समूहों को उत्पाद के रूप में परिभाषित किया है (यदि मुझे तत्व वस्तु के विवरण की आवश्यकता होगी) क्योंकि मैं अपनी सभी संस्थाओं पर एकीकृत समूह चाहता हूं और 'product_details', 'element_details' जैसे सैकड़ों समूहों को रोकने से रोकता हूं।

वहाँ एक रास्ता eventualy क्रमबद्धता समूह को बदलने के लिए जब मैं संबंध या ऐसा ही कुछ की यात्रा है? हैंडलर शायद या ऐसा कुछ?

सादर और किसी भी मदद के लिए धन्यवाद

+2

मैं 'product_detail' /' product_list' आदि समाधान का उपयोग किया है, और यह बहुत अच्छा था, क्योंकि आप हमेशा serialized क्या है पर पूरा नियंत्रण है। डाउनसाइड स्पष्ट रूप से है कि कई वर्गों को क्रमबद्ध करते समय कोड कितना वर्बोज़ होता है ... मैं 'xxx_part' /' xxx_details' के बजाय 'xxx_partial' /' xxx_full' का भी उपयोग करता हूं। – AdrienBrault

+1

@AdrienBrault उत्तर के लिए धन्यवाद।हां मैं अभी उस समाधान का उपयोग कर रहा हूं लेकिन इसका नुकसान है - अगर समूहों में आम तौर पर उपयोग की जाने वाली इकाइयों में कई इकाइयां होती हैं तो समूह को प्रत्येक संबंधित इकाई में परिभाषित किया जाना चाहिए, शब्द समूह समूह एनोटेशन बहुत अधिक – mrMantir

+1

[वर्चुअलप्रोपर्टी] के बारे में है (http://jmsyst.com/libs/serializer/master/reference/annotations#virtualproperty)? –

उत्तर

7

दुर्भाग्य से, आप वास्तव में नहीं है (लेकिन पढ़ते रहते ;-)) कर सकते हैं, अच्छी तरह से कम से कम serializer पुस्तकालय में परिवर्तन के बिना नहीं। अपराधी यह है कि समूहों की सूची GroupExclusionStrategy (जिसे Context द्वारा संदर्भित किया गया है) के भीतर तय किया गया है, जब आप धारावाहिक प्रक्रिया शुरू करते हैं। वास्तव में कोड के भीतर एक दावा है जो एक बार (डी-) धारावाहिक चल रहा है, बहिष्करण रणनीति के संशोधन को रोकता है।

लेकिन के रूप में यह होता है, मैं मेरा एक परियोजना में ठीक उसी समस्या के रूप में अच्छी तरह से किया था, और मैं serializer कोड में आवश्यक परिवर्तन को हैक कर लिया। मैंने कोड को थोड़ा सा साफ़ कर लिया है और इसे गीथब (https://github.com/andreasferber/serializer/tree/recursion-groups) पर अपलोड किया है।

यह जिसके साथ आप जोड़ सकते हैं, हटाने या जब subobjects में उतरते समूहों को ओवरराइड नई संपत्ति मेटाडाटा कहते हैं। एनोटेशन के साथ यह इस तरह दिखता है:

/** 
* @Serializer\RecursionGroups(set={"foo", "bar"}, add={"baz"}, remove={"Default"}) 
*/ 
private $myProperty; 

साथ ही आप XML या YAML मेटाडाटा का उपयोग करने में सक्षम होना चाहिए, लेकिन इस अपरीक्षित है के बाद से मैं उन्हें का उपयोग नहीं करते और मैं अब तक नहीं जोड़ा परीक्षण मामलों। संदर्भ दस्तावेज पर एक नज़र डालें। चूंकि मैंने अभी तक कोई अनुकूलन नहीं किया है, यदि आपकी संस्थाएं वास्तव में बड़ी और गहरी नींव हैं, तो इसका उल्लेखनीय प्रदर्शन प्रभाव हो सकता है।

कृपया आप इस उपयोगी पाते हैं, तो मुझे पता है, या आप किसी भी सुझाव है, क्योंकि अगर यह केवल मेरे द्वारा की जरूरत नहीं है, मैं कुछ परीक्षण जोड़ने और इसे नदी के ऊपर प्रस्तुत करने के लिए कोशिश करेंगे।

+0

पहली नज़र में यह वास्तव में अच्छा लगता है, मैं इसे आज या कल –

+0

अच्छी तरह से आजमाउंगा, आईएमएचओ आधिकारिक धारावाहिक को ' इस सामान्य समस्या के लिए सबसे अच्छा, "सामान्य" समाधान नहीं है, लेकिन 'वर्चुअलप्रॉपर्टी' समाधान –

+2

का उपयोग करने के अलावा, अभी तक पर्याप्त समाधान नहीं मिला है, आपको – Szpadel

0

इस के लिए एक समाधान वास्तव में official documentation में वर्णित है।

कहा जा रहा है समाधान @aferber द्वारा प्रस्तावित कई बिंदुओं पर बेहतर लगता है: बनाए रखने के लिए, कम, वर्बोज़ अधिक लचीला आसान ...

+0

आधिकारिक दस्तावेज़ीकरण में समाधान काम नहीं करता है –