我的目标是实现以下目标; 在任何环境,生产,测试或开发中,应用程序可以有两种模式:生产模式和调试模式。
目前,我已将其设置为config.ini具有此设置。没问题。
当我想要实现以下目标时,问题就出现了: 如果设置了生产模式,我只想显示一个自定义错误页面,如果找不到控制器/操作,则显示一条404消息;如果发生了不同类型的错误,则显示一条错误消息(抛出异常,连接错误)等)。我还需要在可能的情况下将异常记录到日志/文本文件中。 如果设置了调试模式,我想要看的就是发生的异常。
我尝试了各种各样的方法,但我似乎已经走到了尽头。 我尝试过使用ErrorHandler插件,但只是在发生异常时显示空白页面。 我尝试使用自定义插件来处理404错误,但由于它与我的身份验证插件冲突而无法正常工作。尝试没有身份验证插件,但由于我使用模块(实际上只有1个,对于管理员),它会产生问题。
在尝试了各种其他事物和组合之后,我似乎无法找到实现这一目标的方法。
如果有人能够了解如何最好地获得理想的结果,我将不胜感激。
我也有一些假设,如果可以的话,我想澄清一下。他们是:
$oFrontController->throwExceptions(false);
必须设置为false才能使ErrorHandler插件正常工作。这是对的吗?
try {
$oFrontController->dispatch();
} catch (Exception $oException) {
...
}
我有上面的代码来捕获Exceptions抛出并记录它们,但如上所述,似乎没有完成这项工作(当我没有使用ErrorHandler时工作正常,通过设置 $ oFrontController- > throwExceptions(真); )
处理身份验证的最佳方法是什么?我目前将它设置为插件,它根据模块/控制器设置'资源',并检查ACL类,以便是否提供访问权限。我已经看到一些例子,其中ACL部分在控制器的基础上是分开的。如果将身份验证作为模型在控制器初始化时调用,并且如果允许或不允许操作,则检查其各自的权限集是否更为明智? (我问这个主要是因为尝试使用身份验证执行错误页面时出现的冲突,以查看可用的替代方法)
感谢您就此事给我的任何帮助。谢谢。
答案 0 :(得分:4)
安装Exception Formatter Plugin并创建错误控制器
class ErrorController extends Zend_Controller_Action {
public function errorAction() {
$environment = Zend_Registry::getInstance()->configuration->environment;
if( $environment == 'development' ) {
// The ExpectionFormatter requires access to a couple of protected
// items so the must be passed in explicitly. The 3rd param
// controls whether or not the stack trace contains interactive source
// code. When enabled browser performance is degradded. It will default
// to false if the 3rd param is not provided
ExceptionFormatter::display(
$this->_getParam('error_handler'),
$this->_helper,
true
);
} else {
$errors = $this->_getParam('error_handler');
switch ($errors->type) {
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
// 404 error -- controller or action not found
$this->getResponse()->setHttpResponseCode(404);
$this->view->message = 'Page not found';
break;
default:
// application error
$this->getResponse()->setHttpResponseCode(500);
$e = $this->_getParam('error_handler');
$this->view->message = $e['exception']->getMessage();
break;
}
$this->view->environment = $environment;
$this->view->exception = $errors->exception;
$this->view->request = $errors->request;
}
}
}