Zend Framework 的错误控制器提供了统一的错误处理方式, 参阅 http://framework.zend.com/manual/en/zend.controller.html#zend.controller.quickstart.go.errorhandler
当我们工作于模块方式时,常常希望不同模块使用不同的错误处理,比如 default 模块使用默认ErrorController, 后台管理模块 admin 使用 Admin_ErrorController 提供不同的布局和更详细的错误显示。
Plugin 方式为我们提供了方便的设置途径,以下 plugin 设置每个 module 使用 模块里的 ErrorController, 如果模块不提供 ErrorController 则使用默认的 ErrorController:
启动时安装 plugin:
当我们工作于模块方式时,常常希望不同模块使用不同的错误处理,比如 default 模块使用默认ErrorController, 后台管理模块 admin 使用 Admin_ErrorController 提供不同的布局和更详细的错误显示。
Plugin 方式为我们提供了方便的设置途径,以下 plugin 设置每个 module 使用 模块里的 ErrorController, 如果模块不提供 ErrorController 则使用默认的 ErrorController:
require_once ('Zend/Controller/Plugin/Abstract.php');
class Mezi_Controller_Plugin_ErrorControllerSelector extends Zend_Controller_Plugin_Abstract
{
public function routeShutdown(Zend_Controller_Request_Abstract $request)
{
$front = Zend_Controller_Front::getInstance();
//If the ErrorHandler plugin is not registered, bail out
if( !($front->getPlugin('Zend_Controller_Plugin_ErrorHandler') instanceof Zend_Controller_Plugin_ErrorHandler) )
return;
$error = $front->getPlugin('Zend_Controller_Plugin_ErrorHandler');
//Generate a test request to use to determine if the error controller in our module exists
$testRequest = new Zend_Controller_Request_HTTP();
$testRequest->setModuleName($request->getModuleName())
->setControllerName($error->getErrorHandlerController())
->setActionName($error->getErrorHandlerAction());
//Does the controller even exist?
if ($front->getDispatcher()->isDispatchable($testRequest)) {
$error->setErrorHandlerModule($request->getModuleName());
}
}
}
启动时安装 plugin:
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Mezi_Controller_Plugin_ErrorControllerSelector());