2010-04-27 20 views
10

हैंडलिंग हैंडलरंट्रोलर_Plugin_ErrorHandler हमेशा डिफ़ॉल्ट मॉड्यूल में ErrorController :: errorAction() को आगे बढ़ाता है लेकिन मैं चाहता हूं कि यह मॉड्यूल को अवगत कराएं। उदाहरण के लिए जब एक अपवाद फेंकता है तो उसे मॉड्यूल के त्रुटि नियंत्रक को Admin_ErrorController जैसे कॉल करना होगा: त्रुटि क्रिया।ज़ेंड फ्रेमवर्क मॉड्यूल आधारित त्रुटि

मैं यह कैसे कर सकता हूं? धन्यवाद।

उत्तर

23

आप प्लगइन है कि आपके अनुरोध की जांच करने और मौजूदा मॉड्यूल के आधार पर बना सकते हैं सेट ErrorController ...

<?php 
class My_Controller_Plugin_ErrorControllerSwitcher extends Zend_Controller_Plugin_Abstract 
{ 
    public function routeShutdown (Zend_Controller_Request_Abstract $request) 
    { 
     $front = Zend_Controller_Front::getInstance(); 
     if (!($front->getPlugin('Zend_Controller_Plugin_ErrorHandler') instanceof Zend_Controller_Plugin_ErrorHandler)) { 
      return; 
     } 
     $error = $front->getPlugin('Zend_Controller_Plugin_ErrorHandler'); 
     $testRequest = new Zend_Controller_Request_Http(); 
     $testRequest->setModuleName($request->getModuleName()) 
        ->setControllerName($error->getErrorHandlerController()) 
        ->setActionName($error->getErrorHandlerAction()); 
     if ($front->getDispatcher()->isDispatchable($testRequest)) { 
      $error->setErrorHandlerModule($request->getModuleName()); 
     } 
    } 
} 

फिर FrontController साथ प्लगइन रजिस्टर करने के लिए

$front = Zend_Controller_Front::getInstance(); 
$front -> registerPlugin(new My_Controller_Plugin_ErrorControllerSwitcher()) 

का उपयोग करें। यह इंगित करने के लिए जॉनपी धन्यवाद।

+0

आप $ front-> हैप्लगिन ($ नाम) का उपयोग कर सकते हैं; – takeshin

+3

+1 एक आकर्षण की तरह काम करता है और किसी को भी यह सोचने के लिए कि प्लगइन को तुरंत चालू करना है। अपने बूटस्ट्रैप में 'Zend_Controller_Front :: registerPlugin (नई My_Controller_Plugin_Utilities())' डालें। – JohnP

+0

कृपया ध्यान दें कि मैंने कोड अपडेट किया है (क्लासनाम बदल दिया है), ताकि कॉपी और पेस्ट अधिक समझ में आए। यह मेरी उपयोगिता वर्ग का हिस्सा था और अब यह और अधिक वर्णनात्मक होना चाहिए। –

3

वैकल्पिक दृष्टिकोण प्रत्येक मॉड्यूल (या आपको आवश्यक कार्यक्षमता, उदाहरण के लिए Mymodule_MyException) के लिए विशिष्ट अपवाद फेंकने के लिए हो सकता है और फिर उन्हें Default_ErrorController में संभाल लें।

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