2012-07-06 9 views
16

मैं एक आरईएसटी वेब सेवा बनाने की कोशिश कर रहा हूं जो सभी कॉल के लिए जेएसओएन देता है। आम तौर पर यह बिल्कुल स्पष्ट है, मैं सिर्फ इस तरह कार्य करें:Symfony2 नियंत्रक कार्रवाई में उत्पन्न होने वाले सभी अपवादों को कैसे पकड़ें?

return new Response(json_encode($return_object)); 

मेरा प्रश्न, मैं कैसे एक वैश्विक तरह से अपवाद रोकना चाहिए? मैं ऐसा करना चाहता हूं, क्योंकि अगर मेरे आवेदन में कोई अपवाद होता है, तो भी मैं क्लाइंट को एक JSON संदेश वापस लौटना चाहूंगा जो मूल रूप से "यो दाग, मैंने आपको अपवादों की तरह सुना है"। मेरी सोच यह है कि सफलता और विफलता दोनों मामलों में जेएसओएन लौटने से वह काम आसान हो जाएगा जो किसी भी क्लाइंट को मेरे एपीआई को लागू करने के लिए करना है।

अब तक, केवल एक चीज मैं के बारे में सोच सकते हैं इस तरह हर नियंत्रक कार्रवाई लिखने के लिए है:

public function generateMemeAction($arg1, $arg2) { 
    $return_object = array(); 
    try { 
    // stuff to generate meme here 
    $return_object['status'] = "GREAT SUCCESS!"; 
    } catch (Exception $e) { 
    // epic fail 
    $return_object['status'] = "UnluckyBrianException"; 
    } 
    return new Response(json_encode($return_object)); 
} 

कौन सा सभी महान और अद्भुत है, लेकिन यह कोशिश-कैच ब्लॉक हर कार्रवाई के लिए ही होगा मेरे ऐप में, और जब भी मुझे प्रतिलिपि पास्ता के गुच्छा के आसपास संपादित करना होता है तो मैं मूर्खतापूर्ण महसूस करूंगा। प्रो टिप्स?

उत्तर

17

REST ऐप में विभिन्न प्रकार की त्रुटियां हैं। जैसे आपके पास तार्किक त्रुटियां या इनपुट त्रुटियां हो सकती हैं (सभी पैरामीटर नहीं भेजे गए थे)। भिन्न तरीकों का उपयोग करके विभिन्न प्रकार की त्रुटियों को संभालना चाहिए। उस मामले का सबसे अच्छा तरीका इन त्रुटियों के मैन्युअल हैंडलिंग है।

आप अपने कंट्रोलर विशेष त्रुटि विधि में जोड़ सकते हैं (और इसे मूल वर्ग में डाल दें) जो त्रुटि कोड + त्रुटि टेक्स्ट लौटाएगा।

लेकिन आप अपवाद श्रोता उपयोग कर सकते हैं आप स्वत: हैंडलिंग उपयोग करना चाहते हैं:

:

यहां एक नमूना है 10

+5

बहुत बढ़िया! धन्यवाद Evgeny, जो वास्तव में चीजों को साफ़ करता है। थोड़ा और खोदने के बारे में और मुझे पता चला कि उस घटना में फ़ंक्शन की सदस्यता कैसे लें: http://symfony.com/doc/current/cookbook/service_container/event_listener.html – robertdfrench

+3

आप अनुरोध का निरीक्षण करके सशर्त रूप से JSON स्वरूपण भी लागू कर सकते हैं हेडर और जल्दी लौट रहे हैं: 'अगर (! $ event-> getRequest() -> हेडर-> में शामिल है (' स्वीकार करें ',' एप्लिकेशन/जेसन ')) वापसी; ' – Tamlyn

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