Zend Framework应用程序 - 在生产模式下显示404错误页面/通用错误页面并显示开发模式中的异常

时间:2010-03-09 11:00:39

标签: zend-framework error-handling http-status-code-404

我的目标是实现以下目标; 在任何环境,生产,测试或开发中,应用程序可以有两种模式:生产模式和调试模式。

目前,我已将其设置为config.ini具有此设置。没问题。

当我想要实现以下目标时,问题就出现了: 如果设置了生产模式,我只想显示一个自定义错误页面,如果找不到控制器/操作,则显示一条404消息;如果发生了不同类型的错误,则显示一条错误消息(抛出异常,连接错误)等)。我还需要在可能的情况下将异常记录到日志/文本文件中。 如果设置了调试模式,我想要看的就是发生的异常。

我尝试了各种各样的方法,但我似乎已经走到了尽头。 我尝试过使用ErrorHandler插件,但只是在发生异常时显示空白页面。 我尝试使用自定义插件来处理404错误,但由于它与我的身份验证插件冲突而无法正常工作。尝试没有身份验证插件,但由于我使用模块(实际上只有1个,对于管理员),它会产生问题。

在尝试了各种其他事物和组合之后,我似乎无法找到实现这一目标的方法。

如果有人能够了解如何最好地获得理想的结果,我将不胜感激。

我也有一些假设,如果可以的话,我想澄清一下。他们是:

$oFrontController->throwExceptions(false);

必须设置为false才能使ErrorHandler插件正常工作。这是对的吗?

try {
$oFrontController->dispatch();
} catch (Exception $oException) {
...
}

我有上面的代码来捕获Exceptions抛出并记录它们,但如上所述,似乎没有完成这项工作(当我没有使用ErrorHandler时工作正常,通过设置 $ oFrontController- > throwExceptions(真);

处理身份验证的最佳方法是什么?我目前将它设置为插件,它根据模块/控制器设置'资源',并检查ACL类,以便是否提供访问权限。我已经看到一些例子,其中ACL部分在控制器的基础上是分开的。如果将身份验证作为模型在控制器初始化时调用,并且如果允许或不允许操作,则检查其各自的权限集是否更为明智? (我问这个主要是因为尝试使用身份验证执行错误页面时出现的冲突,以查看可用的替代方法)

感谢您就此事给我的任何帮助。谢谢。

1 个答案:

答案 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;
        }
    }
}