zend框架的自定义500错误页面

时间:2012-11-13 20:26:46

标签: php zend-framework

是否可以为zend框架设置自定义500错误页面?我的意思是在ErrorController中...如果你有一个500错误,看看自定义视图渲染。

<?php
class ErrorController extends Zend_Controller_Action
{
    private $_notifier;
    private $_error;
    private $_environment;

    public function init()
    {
        parent::init();


        $this->_error = $this->_getParam('error_handler');
   }

    public function errorAction()
    {
        switch ($this->_error->type) {
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
                $this->getResponse()->setHttpResponseCode(404);
                $this->view->message = 'Page not found';
                break;
            default:
                //Doesn't work
                $this->renderScript('error/500.phtml');
                $this->getResponse()->setHttpResponseCode(500);
            break;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

是的,这是完全可能的,但这取决于你为什么最终会获得状态500的原因。

导致Apache Web服务器发出此状态的任何内容都无法通过您的ErrorController以简单的方式拦截。

但是,如果您决定使用HTTP响应代码500退出某个操作,则可以自由地执行此操作。

一个重要的事情是:如果抛出未捕获的异常,Zend Framework将捕获它并重定向到错误控制器。此异常对象在“error_handler”参数中存储为属性“exception”。因此,在您的代码中,您应该只能询问您是否因为一个无法捕获的异常而在那里:

if (isset($this->_error->exception) && $this->_error->exception instanceof Exception) {
  // You got an exception
}

我个人认为我的控制器能够抛出Controller_Exception,它携带必须发出的HTTP状态码。如果需要对响应代码进行详细控制,只有控制器应该决定响应方会发生什么事情。

关于日志记录:记录发生错误的位置。如果某些东西让你抛出异常,那么正确的记录位置就在抛出之前,我会说。当然,您也可以随时登录错误控制器,以表示曾经可能只处于警告级别的错误确实没有被捕获并且确实是错误,但这可能并不能真正告诉您哪里出了问题。< / p>