1

我正在尝试使用 CakePHP 2.1.0实现类似Mark Story 的“Down for Maintenance”页面。这是我到目前为止所拥有的:

应用程序/配置/bootstrap.php:

Configure::write('App.maintenance', true);

应用程序/控制器/AppController.php:

if (Configure::read('App.maintenance')) {
    App::uses('UnderMaintenanceException', 'Error/Exception');
    throw new UnderMaintenanceException();
}

最后,我有一个位于“app/Lib/Error/Exception/UnderMaintenanceException.php”的文件,但它是空白的,因为我不知道该放什么。无论调试是否设置为 0,我怎样才能使它成为一个看起来友好的“我们正在维护”页面?谢谢!

编辑:我现在意识到我的问题有些不清楚。所以我把以下内容放在我的“app/Lib/Error/Exception/UnderMaintenanceException.php”文件中:

<?php
class UnderMaintenanceException extends HttpException {}

现在,当我转到任何页面时,都会得到以下输出:

Fatal Error (256): [UnderMaintenanceException] 
#0 /Applications/MAMP/htdocs/my_project/app/Lib/Error/AppExceptionRenderer.php(12): AppController->beforeFilter()
#1 /Applications/MAMP/htdocs/my_project/lib/Cake/Error/ExceptionRenderer.php(232): AppExceptionRenderer->_outputMessage('error500')
#2 [internal function]: ExceptionRenderer->error500(Object(UnderMaintenanceException))
#3 /Applications/MAMP/htdocs/my_project/lib/Cake/Error/ExceptionRenderer.php(165): call_user_func_array(Array, Array)
#4 /Applications/MAMP/htdocs/my_project/lib/Cake/Error/ErrorHandler.php(127): ExceptionRenderer->render()
#5 [internal function]: ErrorHandler::handleException(Object(UnderMaintenanceException))
#6 {main} [CORE/Cake/Error/ErrorHandler.php, line 136]

如果我将调试值更改为 0,则不会得到任何输出。不是很友好!无论哪种方式,我该怎么做才能获得友好的输出?

4

1 回答 1

0

只需在您创建的新类中重写构造函数,如下所示:

<?php

/**
 * Represents an 'Under Maintenance Error'
*/
class UnderMaintenanceException extends HttpException {

    /**
    * Constructor
    *
    * @param string $message If no message is given, it defaults to
    *                       'Application is Under Maintenance'
    * @param int $code Status code, defaults to 403
    */
    public function __construct($message = null, $code = 403) {
        if (empty($message)) {
            $message = 'Application is Under Maintenance';
        }
        parent::__construct($message, $code);
    }
}

有些人可能会争辩说要返回的正确状态代码是 503(服务不可用)。他们是对的。然而,由于 CakePHP 2.x 处理 5xx 错误的方式,生产中用户唯一可见的错误是“发生内部错误”,这不是很具描述性。4xx 错误将错误消息传递给用户,但不会出现 5xx 错误。

为了能够与描述性消息一起返回状态 503,需要扩展 ExceptionRenderer 并覆盖函数 error500($error)。

于 2015-11-16T13:50:19.360 回答