2012-08-09 11 views
5

मेरे आवेदन का एक हिस्सा एपीआई के रूप में उपलब्ध होगा, इसलिए मेरे कुछ पेज को JSON या XML (स्वीकार्य हेडर 'सामग्री प्रकार' के आधार पर) में उपलब्ध होना आवश्यक है।Symfony2 + FOSRestBundle: प्रति नियंत्रक/क्रिया प्रति REST कार्यक्षमता को सक्षम/अक्षम करें?

मैं FOSRestBundle का उपयोग किया है और यह बहुत अच्छी तरह से काम करता है, लेकिन अब सभी अपने पृष्ठों एक्सएमएल (या JSON) में उपलब्ध हैं जब भेजने हैडर स्वीकार करें 'सामग्री प्रकार: application/xml'।

तो, मैं अपने कुछ नियंत्रकों/कार्यों के लिए इस कार्यक्षमता को सक्षम/अक्षम करना चाहता हूं। मैं एनोटेशन का उपयोग करके ऐसा करने के लिए आदर्श होगा।

क्या यह संभव है?

मेरे config.yml:

fos_rest: 
    view: 
     formats: 
      rss: false 
      xml: true 
      json: true 
     templating_formats: 
      html: true 
     force_redirects: 
      html: false 
     failed_validation: HTTP_BAD_REQUEST 
     default_engine: twig 
     view_response_listener: force 
    body_listener: 
     decoders: 
      json: acme.decoder.json 
      xml: fos_rest.decoder.xml 
    format_listener: 
     default_priorities: ['html', 'xml', 'json', '*/*'] 
     fallback_format: html 
     prefer_extension: false  

उत्तर

6

the RestBundle's documentation के अनुसार, आप अगर आप अपने नियंत्रक में एक View का उपयोग नहीं करते एक एक्सएमएल उत्पादन नहीं मिलेगा। इसलिए, यदि आप अपनी कार्रवाई में @View एनोटेशन, या View::create() का उपयोग नहीं करते हैं, और आप क्लासिक प्रतिक्रिया वापस करते हैं, तो आपको एक HTML आउटपुट मिलेगा।

आप कुछ कारणों के लिए प्रारूप बाध्य करना चाहते हैं, तो आप prefer_extensiontrue को कर देते हैं और मार्ग परिभाषा समायोजित कर सकते हैं:

my_route: 
    pattern: /my-route 
    defaults: { _controller: AcmeDemoBundle:action, _format: <format> } 

कहाँ <format> प्रारूप आप मजबूर करने के लिए चाहते हैं।

2

आप view_response_listener से false पर सेट कर सकते हैं (डिफ़ॉल्ट force है)। और उसके बाद अपने प्रत्येक नियंत्रक कक्षाओं में @View एनोटेशन जोड़ें, जहां आप आरईएसटी का उपयोग करना चाहते हैं।

उदाहरण इसे स्पष्ट कर देगा।

बाकी के बिना एक controler:

/** 
* @Route("/comments") 
*/ 
class CommentsControler extends Controller 
{ 
    /** 
    * @Route("/") 
    * @Method({"POST"}) 
    */ 
    public function newAction() { ... } 

    /** 
    * @Route("/{id}") 
    */ 
    public function detailAction($id) { ... } 

    ... 
} 

और बाकी के साथ एक और नियंत्रक। ध्यान दें कि कक्षा के लिए केवल @View एनोटेशन आवश्यक है (जब तक आप प्रतिक्रिया स्थिति कोड को ओवरराइड नहीं करना चाहते)।

/** 
* @View 
* @Route("/api/comments") 
*/ 
class RestfulCommentsControler extends Controller 
{ 
    /** 
    * @Route("/") 
    * @Method({"POST"}) 
    */ 
    public function newAction() { ... } 

    /** 
    * @Route("/{id}") 
    */ 
    public function detailAction($id) { ... } 

    /** 
    * @View(statusCode=204) 
    * @Route("/{id}/delete") 
    */ 
    public function deleteAction($id) { ... } 

    ... 
} 
  • ViewFOS\RestBundle\Controller\Annotations\View
  • RouteSymfony\Component\Routing\Annotation\Route
+1

अच्छा लगता है, लेकिन यह काम करने के लिए प्रतीत नहीं होता। –

+0

यह मेरे लिए काम करता है। क्या आप सही 'व्यू' एनोटेशन क्लास का उपयोग कर रहे हैं? क्या आप अधिक जानकारी प्रदान कर सकते हैं? –

+1

यदि आप 'बाकी के रूप में FOS \ RestBundle \ Controller \ Annotations का उपयोग करते हैं;', आपकी टिप्पणियां '@ व्यू 'की बजाय' @Rest \ View' होनी चाहिए – alexismorin

संबंधित मुद्दे