2012-04-26 11 views
6

इस दस्तावेज़ के पृष्ठ पर तदनुसार:सिम्फनी 2 अपवादों को ओवरराइड करना?

http://symfony.com/doc/current/cookbook/controller/error_pages.html

Symfony अपवाद के प्रदर्शन को नियंत्रित करने के लिए TwigBundle उपयोग करता है। हालांकि, मैं दस्तावेज़ में उल्लिखित प्रदर्शन को अनुकूलित करने की तलाश नहीं कर रहा हूं, मैं इसे ओवरराइड करना चाहता हूं। मैं एक छोटी आरईएसटी एपीआई पर काम कर रहा हूं और मैं अपने बंडल में ट्विगबंडल के कॉलिंग को ओवरराइड करना चाहता था, अपने स्वयं के अपवादों को संभालने (आरईएसटी के संदर्भ में: सही HTTP स्टेटस कोड और सादे-पाठ बॉडी प्रतिक्रियाओं को मैप करें)।

मुझे इसके बारे में कुछ भी नहीं मिला और मैनुअल पर संदर्भ अच्छा नहीं है, विशेष रूप से कर्नेल भाग पर। शायद किसी ने पहले ही ऐसा किया है और मेरी मदद कर सकता है? धन्यवाद।

उत्तर

11

आप एक श्रोता उस पर सुनता है बनाना चाहिए JSON अनुरोधों के लिए Symfony द्वारा आंतरिक अपवाद पकड़ अक्षम करने के लिए मेरी AppKernel.php का हिस्सा है kernel.exception घटना। कि श्रोता के onKernelException विधि में आप अपने अपवाद के लिए जाँच कर सकते हैं जैसे

अपवाद श्रोता वर्ग पर

//namespace declarations 
    class YourExceptionListener 
    { 

     public function onKernelException(GetResponseForExceptionEvent $event) 
     { 
     $exception = $event->getException(); 
     if ($exception instanceof YourException) { 
      //create response, set status code etc. 
      $event->setResponse($response); //event will stop propagating here. Will not call other listeners. 
     } 
     } 
    } 

सेवा घोषणा

//services.yml 
kernel.listener.yourlisener: 
    class: FQCN\Of\YourExceptionListener 
    tags: 
    - { name: kernel.event_listener, event: kernel.exception, method: onKernelException } 
+0

क्या मैं श्रोता को अपने बंडल की जड़ पर रख सकता हूं? – vinnylinux

+0

हालांकि काम नहीं किया, यह अपवादों को ओवरराइड नहीं कर रहा है। – vinnylinux

+0

डीबग मोड देव टूलबार प्रोफाइलर पेज में। बाईं तरफ इवेंट टैब का चयन करें। आप श्रोताओं की सूची देखेंगे। जांचें कि आपका श्रोता वहां है या नहीं। –

1

Bellow, (यदि आप दूसरा एक बनाने की handle विधि ओवरराइड कर सकते हैं)

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpKernel\HttpKernelInterface; 
use Symfony\Component\HttpKernel\Kernel; 
use Symfony\Component\Config\Loader\LoaderInterface; 

class AppKernel extends Kernel { 
    public function init() { 
    parent::init(); 

    if ($this->debug) { 
     // workaround for nasty PHP BUG when E_STRICT errors are reported 
     error_reporting(E_ALL); 
    } 
    } 

    public function handleForJson(Request $request, 
           $type = HttpKernelInterface::MASTER_REQUEST, 
           $catch = true 
) { 
    return parent::handle($request, $type, false); 
    } 
    ... 
+1

यह एक छोटे से hackish हो रहा है होगा ... किसी भी अन्य रास्ता? – vinnylinux

+0

ओओपी कन्फेटियन के साथ विस्तार कक्षा हैकिश है? – sbczk

+0

सुनिश्चित नहीं है कि "ओओपी सम्मेलन" का क्या मतलब है। अच्छा विचार है कि ढांचे वर्गों को ओवरराइट न करें। कर्नेल एवेन्ट्स :: एक्सेप्शन को हैंडल की बहुत शुरुआत पर फेंक दिया गया है ताकि आप फ्रेमवर्क कक्षाओं को संशोधित करने के बजाय अपने स्वयं के श्रोता में इसे सुनकर वहां प्लग इन कर सकें। – smentek