2012-09-13 39 views
48

चलें कहते हैं कि मैं एक XML- प्रतिक्रिया बनाने के लिए ऐसा ही कुछ लग रहा है इच्छा चाहते हैं निम्नलिखित:JMSSerializerBundle का उपयोग करके एक अच्छा हाइपरमीडिया प्रारूप कैसे बनाएं?

<?php 
// Product.php 
namespace Acme\Bundle\ProductBundle\Entity; 
use Acme\Bundle\ProductBundle\Money\Money; 

class Product 
{ 
    /** 
    * @var integer 
    */ 
    private $id; 

    /** 
    * @var string 
    */ 
    private $name; 

    /** 
    * @var Money 
    */ 
    private $price; 

    [..] 
} 

और एक पैसा श्रेणी:

<?xml version="1.0" encoding="utf‐8"?> 
<product xmlns="urn:com.acme.prods" xmlns:atom="http://www.w3.org/2005/xlink"> 
    <id>1234</id> 
    <name>Red Stapler</name> 
    <price currency="EUR">3.14</price> 
    <atom:link rel="payment" type="application/com.acme.shop+xml" 
      href="http://acme.com/products/1234/payment" /> 
</product> 

एक डोमेन मॉडल है जो निम्न तरह दिखता है को देखते हुए के साथ:

<?php 
// Money.php 
namespace Acme\Bundle\ProductBundle\Money; 

class Money 
{ 
    /** 
    * @var string 
    */ 
    private $currency; 
    /** 
    * 
    */ 
    private $amount; 
} 

अब, मेरे प्रश्नों के लिए। यह एक प्रतिक्रिया है कि निम्नलिखित

<?xml version="1.0" encoding="utf‐8"?> 
<product> 
    <id>1234</id> 
    <name>Red Stapler</name> 
    <price currency="EUR">3.14</price> 
</product> 

की तरह लग रहा JMSSerializerBundle बताओ कि उत्पाद-वस्तु को क्रमानुसार करने के लिए या तो एनोटेशन, XML या YAML का उपयोग कर बनाने के लिए बहुत सरल हो जाएगा। हालांकि, xmlns:atom और <atom:link> प्रविष्टियों को इकाई द्वारा निर्दिष्ट नहीं किया जाना चाहिए, क्योंकि इसमें की कोई अवधारणा नहीं होनी चाहिए, और जहां स्थित है। आप विभिन्न rel -attributes जैसे edit के साथ और अधिक लिंक की कल्पना भी कर सकते हैं।
एक समाधान जो दिमाग में आता है वह एक ऐसी सेवा होगी जो विशिष्ट वस्तुओं के लिए धारावाहिक घटनाओं को सुनती है, और इन विशेषताओं और टैग को उपयुक्त के रूप में जोड़ती है। सेवा इन लिंक को अनुरोधित प्रारूप के लिए उपयुक्त प्रारूप में उत्पन्न करने के लिए Request, Router-सेवा आदि को पकड़ने के लिए DI का उपयोग कर सकती है। एक XML- जवाब में आईई, यह application/media-format+xml को उचित प्रकार सेट कर सकते हैं, जबकि एक json-जवाब में, यह

"links": [ 
    { 
    "rel": "payment", 
    "type": "application/media-format+json", 
    "href": "[...]" 
    } 
] 

अब की तरह कुछ उत्पन्न कर सकता है, the documentation for JMSSerializerBundle में, मैं @PreSerialize के लिए एनोटेशन मिल जाए, और @PostSerialize, लेकिन वे केवल धारावाहिक होने वाली वस्तु पर विधियों को कॉल करने में सक्षम हैं।
क्या कोई जानता है कि यह कैसे प्राप्त किया जा सकता है? या क्या मुझे टिग्लेटिंग इंजन का उपयोग करना है जैसे टिग और मैन्युअल रूप से एक्सएमएल-प्रतिक्रिया बनाते हैं?

+0

बहुत ही रोचक सवाल। थोड़ा सा पोक करने के बाद, मुझे लगता है कि कोई अन्य समाधान नहीं है, फिर केवल अपनी धाराओं को धारावाहिकरण के लिए उपयोग किए जाने वाले अतिरिक्त विशेषताओं के साथ प्रदूषित कर रहा है ... बंडल में जो गुम हो रहा है, वह किसी विशेष वस्तु के पूर्ण क्रमबद्धीकरण को संभालने की संभावना है कक्षा। – room13

+0

[आप यहाँ जाँच कर सकते हैं 1: निर्दिष्ट समूह-प्रति-विशेषता] [1] [इसके अलावा यहां 2: jms serializer बंडल कॉम्प्लेक्स-जनरेटेड-मूल्य] [2] [ 1]: http://stackoverflow.com/questions/13665369/jmsserializerbundle-specify-group-per-attribute [2]: http://stackoverflow.com/questions/14475171/jmsserializerbundle-complex-generated-value –

उत्तर

3

अकेले सीरिएलाइज़र बंडल इस स्थिति के लिए पर्याप्त नहीं हो सकता है क्योंकि यह केवल क्रमिकरण और deserialization से संबंधित है, अधिक जटिल semantical कार्यों नहीं।

मैं आपके एपीआई के लिए एक सुंदर हाइपरमीडिया प्रारूप को लागू करने के लिए FSCHateoasBundle में देखने का सुझाव दूंगा।