【问题标题】:Zend Framework Application - Showing 404 Error Pages / Generic Error Pages in Production Mode and showing Exceptions in Development ModeZend Framework 应用程序 - 在生产模式下显示 404 错误页面/通用错误页面并在开发模式下显示异常
【发布时间】:2011-01-25 09:26:30
【问题描述】:

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

目前,我已对其进行设置,以便 config.ini 具有此设置。没有问题。

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

我尝试了各种方法,但我似乎走到了死胡同。 我试过使用 ErrorHandler 插件,但它只是在发生异常时显示一个空白页。 我尝试使用自定义插件来处理 404 错误,但它并没有真正起作用,因为它与我的身份验证插件冲突。在没有身份验证插件的情况下尝试过,但由于我使用了模块(实际上只有 1 个,对于管理员),它会出现问题。

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

如果有人能阐明如何最好地获得所需的结果,我将不胜感激。

如果可以的话,我还想澄清一些假设。它们是:

$oFrontController->throwExceptions(false);

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

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

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

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

感谢您在这件事上给我的任何帮助。谢谢。

【问题讨论】:

  • 等等。所以你想复制“环境”设置?
  • 不确定您的意思。在我的 config.ini 中,我设置了不同的环境(Live、Dev 等)。在它们中的每一个中,我都有一个调试参数,它是 1 或 0。如果它设置为 1,它是调试模式,如果它是 0,它是生产模式。我希望这能澄清我想要表达的意思。谢谢~
  • 不知何故,我的设置现在似乎可以工作了(普通的旧 ErrorHandler 插件)。我认为,由于我尝试的各种方法,可能早先出现了某种冲突。感谢您的帮助。

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


【解决方案1】:

安装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;
        }
    }
}

【讨论】:

  • 嗨 Clyfe,感谢您的建议。不知何故,我的设置现在似乎可以工作了(普通的旧 ErrorHandler 插件)。我认为,由于我尝试的各种方法,可能早先出现了某种冲突。通过插件(虽然看起来更像是一个 View Helper),在开发过程中似乎非常方便。再次感谢您的建议。
猜你喜欢
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 2015-09-16
  • 2021-05-28
  • 2022-01-20
相关资源
最近更新 更多