CakePHP 2.1.0: страница «На обслуживании» - PullRequest
1 голос
/ 10 марта 2012

Я пытаюсь реализовать что-то вроде Mark Story на странице "Down for Maintenance" , используя CakePHP 2.1.0. Это то, что я до сих пор:

приложение / Config / 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 голосов
/ 16 ноября 2015

Просто переопределите конструктор в новом классе, который вы создали, следующим образом:

<?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 ошибки передают пользователю сообщение об ошибке, но не так erros 5xx.

Чтобы иметь возможность вернуть статус 503 вместе с описательным сообщением, необходимо расширить ExceptionRenderer и переопределить функцию error500 ($ error).

...