Перенаправление обслуживания в CakePHP 2.0

Я пытаюсь создать страницу перенаправления обслуживания для веб-сайта, чтобы можно было активировать «Режим обслуживания/обновления», что приведет к перенаправлению каждого запроса страницы на страницу «Недоступно для обслуживания». Я установил переключатель на глобальную переменную, записанную с помощью Configure::write() и проверяющую с помощью Configure::read().

Проблема, с которой я сталкиваюсь, заключается в следующем: когда он находится в автономном режиме, как мне перенаправить каждый запрос страницы? Моей первой мыслью было условное $this->redirect(...) в функции AppController beforeFilter(). Но это привело к ошибке «Цикл перенаправления»:

введите здесь описание изображения

Моя вторая мысль заключалась в том, что, возможно (я новичок в CakePHP), это вызывалось так часто, будучи первым фильтром контроллера базового класса, что эта идея была глупой. Я подумал, что смогу исправить это, создав «MaintenanceFilter», который проверял бы одну и ту же переменную на статус онлайн или офлайн для перенаправления. Однако в CookBook упоминаются фильтры, являющиеся новыми для Cake 2.2, а на этом веб-сайте используется 2.1. Фильтр также не работает, даже если я даю ему приоритет 1 (определяется в приложении/Маршрутизация/Фильтр).

App::uses('DispatcherFilter', 'Routing');

class MaintenanceFilter extends DispatcherFilter
{
    public function beforeDispatch(CakeEvent $event)
    {
        if (strcmp(Configure::read('ServerStatus'), 'online') == 0)
        {
            $event->stopPropagation();

            $dispatcher = new Dispatcher();

            $dispatcher->dispatch(array('controller' => 'errors', 
                            'action' => 'maintenance'));
        }
    }
}

Затем я подумал, что, возможно, я мог бы просто сделать это в более общем виде и установить условие маршрутизации с помощью Router::connect('*', ...), которое перенаправляло бы ВСЕ страницы в /Errors/maintenance, где условная проверка состояния сервера :

Router::connect('*', array('controller' => 'Errors', 
                        'action' => 'maintenance')); 

Я разместил его в верхней части файла маршрутизации, чтобы он обрабатывался первым. Как вы могли догадаться, ни одна страница никогда не перенаправлялась на страницу обслуживания.

Я думал, что могу просто создать собственный обработчик исключений и генерировать исключение, когда сервер находится в «автономном режиме», но как тогда мне перенаправить на страницу обслуживания из тела метода обработчика?

Я должен упустить что-то конкретное о Cake 2.1 или просто Cake/MVC в целом. Кто-нибудь видел, что это может быть?


person Mister R2    schedule 22.03.2013    source источник


Ответы (2)


Ваше первое решение, которое дало вам ошибку перенаправления, должно быть в порядке - скорее всего, вы не выполнили проверку, чтобы увидеть, находитесь ли вы уже на странице обслуживания, поэтому это означает, что когда вы будете перенаправлены на страницу обслуживания, как и любая другая страница, она просто автоматически снова перенаправляет вас на страницу обслуживания — отсюда и цикл.

Это непроверенный код, но он должен работать или, по крайней мере, направить вас на правильный путь:

function beforeFilter() {

    // Check if we are in offline mode
    if(!empty(Configure::read('offline_mode'))){

        // Check if we are already on the maintenance page
        $firstParam = ($this->request->params['pass'][0]))? $this->request->params['pass'][0]: '';
        if (isset($this->request->controller == 'pages' and $firstParam == 'maintenance')) {
            // Don't do anything - we don't want to redirect again.
        } else {
            // Redirect to the maintenance page
            $this->redirect(array('controller' => 'pages', 'action' => 'display', 'maintenance'));
        }
    }
}
person joshua.paling    schedule 22.03.2013
comment
Хорошо поймал! Вы были совершенно правы; как только я добавил проверку на то, что текущая страница является страницей обслуживания, она работала без сучка и задоринки. Большое спасибо! - person Mister R2; 22.03.2013

Вы можете использовать следующий фильтр, чтобы включить режим обслуживания в своем приложении.

cakephp-maintenance-mode

person aWebDeveloper    schedule 20.02.2014
comment
Почище, согласен. Также возможно: используя базовый класс библиотеки, см. moving-a- приложение cakephp. - person mark; 24.12.2014
comment
новее знал, что такое существует, иначе не создал бы - person aWebDeveloper; 26.12.2014
comment
Он всегда существовал в очень простом состоянии ;) Недавно для Cake3 был добавлен фильтр Dispatcher. Наличие более одного репо тоже не помешает :) Часто бывают разные детали реализации. Так что все в порядке. - person mark; 26.12.2014