2013-03-22 2 views
1

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

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

enter image description here

Моя вторая мысль была, что, возможно (я новичок в 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')); 
     } 
    } 
} 

Я тогда подумал, что, возможно, я просто не мог сделать это в более общем плане, а также установить Routing состояния с маршрутизатором :: подключение («*», ...), которые будут перенаправлять все страницы/Ошибки/техническое обслуживание, где условная проверка состояния сервера:

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

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

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

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

ответ

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')); 
     } 
    } 
} 
+0

Nice catch! Вы были совершенно правы; как только я добавил проверку текущей страницы на страницу обслуживания, она работала без сбоев. Большое спасибо! –

0

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

cakephp-maintenance-mode

+0

Путь чище, согласен. Также возможно: использование базового класса lib см. В [move-a-cakephp-app] (http://www.dereuromark.de/2013/09/29/moving-a-cakephp-app). – mark

+0

Новее знал, что это существовало, иначе бы не было создано – aWebDeveloper

+0

Он всегда существовал в очень очень базовом состоянии;) Использование фильтра Dispatcher недавно было добавлено только для Cake3. Наличие более одного репо также не повредит :) Часто возникают различные детали выполнения. Так все в порядке. – mark

 Смежные вопросы

  • Нет связанных вопросов^_^