Перенаправление на страницу обслуживания в CakePHP не работает - PullRequest
0 голосов
/ 21 июля 2011

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

В настоящее время я пытался сделать это с $this->cakeError():

in app_controller.php:

function beforeFilter(){
....
if($this->__get_config('maintenance_status') == 1){
        $this->cakeError('maintenance', array('message' => $this->__get_config('maintenance_message')));    
    }
....
}

и в app_error.php:

function maintenance($message){
    $this->controller->set('message', $message['message']); 
    ($this->controller->RequestHandler->isAjax()) ? $this->_outputMessage('ajax_maintenance') : $this->_outputMessage('maintenance');
}

Проблема в том, что происходит фатальная ошибка, которая говорит: Call to a member function isAjax() on a non-object. Но я, очевидно, установил RequestHandler Компонент в app_controller.php. Более того, я попытался вызвать эту ошибку из другого контроллера, и она не дает мне фатальной ошибки.

В чем может быть проблема? Почему он не признает, что я инициализировал Компонент?

Ответы [ 3 ]

0 голосов
/ 22 июля 2011

Немного лучше было бы также использовать Configure :: read ("System.maintenance") или аналогичный. (Я склонен использовать пространство имен в моих конфигурационных данных, система - это пространство имен для таких вещей, как флаги обслуживания и т. Д.)

Кроме того, как сказал Чарльз, не используйте страницу с ошибкой для ожидаемого события. Ошибки должны показывать пользователю, а приложению обрабатывать уведомления и т. Д. О непредвиденных сбоях. Страница обслуживания может быть просто файлом представления в папке / app / views / pages /. Перенаправить на него, если для ключа конфигурации установлено значение true / 1.

0 голосов
/ 22 июля 2011

Ваш подход кажется разумным, но вы можете его немного переусердствовать.

У меня есть похожая настройка на сайте, который я сейчас разрабатываю, и я просто использую компонент auth, чтобы позаботиться о неммне.

Чтобы выручить, я установил новый автономный макет, который я заставляю приложение использовать, если статус сайта равен 0 (автономный).Если статус равен 0, app_controller запрещает доступ ко всему сайту.

$this->Auth->deny('*');
$this->layout = "offline";

Кроме того, в этом макете у меня есть скрытая форма входа, которая появляется, если пользователь нажимает на сообщение. Если пользователь может пройти проверку подлинности (всепользователи на данный момент - разработка) доступ предоставляется всему сайту с использованием шаблона по умолчанию.

Проверьте это, это может помочь вам ...

Нажмите здесь

Часть кода, но вы можете прочитать об этом большепо ссылке выше

function beforeFilter(){
// Site Offline = 0 , Site Online = 1
if($this->Configuration->get_site_status() == 1){
      // Allow access to the site to all users and perform all required 
      // beforeFilter code
}else{
    ...
    // If site is OFFLINE but User is logged in allow access. 
    // Later I will need to change it to only allow admin access if logged in as I am still developing
    // Everyone else will be denied access even if they are able to authenticate          
    if(!$this->Auth->user() == null){
        $this->layout = 'default';
        $this->Auth->allow('*');
    }else{        
        $this->layout = 'offline';
        $this->Auth->deny('*');
    }
    ...
  }
}
0 голосов
/ 21 июля 2011

Из книги CakePHP :

Вызов этого метода покажет пользователю страницу с ошибкой и остановит любую дальнейшую обработку в вашем приложении

Я предполагаю, что вы вызываете ошибку при некотором обратном вызове в AppController.

Если это так, вы, скорее всего, остановите выполнение своего скрипта до того, как будут созданы ваши компоненты. Это наверняка приведет к вашей ошибке.

Теперь, я думаю, что эта ошибка - хороший шанс пересмотреть, как вы справляетесь с проблемой. Это действительно ошибка? Вы знаете, что статус обслуживания установлен, поэтому ожидается , что пользователю будет показана эта страница. Это не ошибка. Более того, вы, конечно, не захотите, чтобы в вашем журнале было 10 000 сообщений о том, что вы включили обслуживание!

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

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

Мы будем использовать beforeFilter() обратный вызов контроллера.

class AppController extends Controller {

    public function beforeFilter() {
        if ($this->_get_config('maintenance_status') === 1) {
            $this->redirect('/maintenance');
        }
    }

}

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

...