Zend_Controller_Plugin_ErrorHandler始終轉發到默認模塊中的ErrorController :: errorAction(),但我希望它是模塊感知。例如,當拋出異常時,它必須像Admin_ErrorController:errorAction一樣調用模塊的ErrorController。Zend Framework模塊基於錯誤處理
我怎樣才能做到這一點? 謝謝。
Zend_Controller_Plugin_ErrorHandler始終轉發到默認模塊中的ErrorController :: errorAction(),但我希望它是模塊感知。例如,當拋出異常時,它必須像Admin_ErrorController:errorAction一樣調用模塊的ErrorController。Zend Framework模塊基於錯誤處理
我怎樣才能做到這一點? 謝謝。
您可以創建插件,將檢查您的請求,並根據當前的模塊設置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指出了這一點。
替代方法可能會爲每個模塊(或您需要的功能,例如Mymodule_MyException
)拋出特定的例外,然後在Default_ErrorController
中處理它們。
您可以使用$ front-> hasPlugin($ name); – takeshin 2010-04-29 08:18:43
+1的工作原理就像是一種魅力,對於任何想知道插件實例化的人來說。將'Zend_Controller_Front :: registerPlugin(新的My_Controller_Plugin_Utilities())'放在引導程序中就可以做到。 – JohnP 2011-03-11 11:25:19
請注意我已經更新了代碼(更改了類名),以便複製粘貼更有意義。這是我公用事業課的一部分,現在它應該更具描述性。 – 2011-03-11 13:34:54