我正在尝试使用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,则无法输出。不是很友好!无论如何都可以做出友好的输出?
答案 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)。