2010-04-27 41 views
10

Zend_Controller_Plugin_ErrorHandler始終轉發到默認模塊中的ErrorController :: errorAction(),但我希望它是模塊感知。例如,當拋出異常時,它必須像Admin_ErrorController:errorAction一樣調用模塊的ErrorController。Zend Framework模塊基於錯誤處理

我怎樣才能做到這一點? 謝謝。

回答

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()); 
     } 
    } 
} 

然後使用

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

註冊到FrontController設計的插件。感謝JohnP指出了這一點。

+0

您可以使用$ front-> hasPlugin($ name); – takeshin 2010-04-29 08:18:43

+3

+1的工作原理就像是一種魅力,對於任何想知道插件實例化的人來說。將'Zend_Controller_Front :: registerPlugin(新的My_Controller_Plugin_Utilities())'放在引導程序中就可以做到。 – JohnP 2011-03-11 11:25:19

+0

請注意我已經更新了代碼(更改了類名),以便複製粘貼更有意義。這是我公用事業課的一部分,現在它應該更具描述性。 – 2011-03-11 13:34:54

3

替代方法可能會爲每個模塊(或您需要的功能,例如Mymodule_MyException)拋出特定的例外,然後在Default_ErrorController中處理它們。