CakePHP 2.1.0:“正在维护”页面

时间:2012-03-09 22:26:04

标签: exception cakephp cakephp-2.1

我正在尝试使用CakePHP 2.1.0实现Mark Story's "Down for Maintenance" page之类的东西。这就是我到目前为止所做的:

应用程序/配置/ 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,则无法输出。不是很友好!无论如何都可以做出友好的输出?

1 个答案:

答案 0 :(得分: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)。