CakePHP 2.0 - beforeFilter () не запускается на cakeErrorController? - PullRequest
8 голосов
/ 28 января 2012

Я работал с CakePHP 1.3, но это мое первое знакомство с CakePHP 2.0 и PHP-исключениями, так что терпите меня, если мой вопрос покажется многословным.

В моих AppController beforeFilter() я установил пару переменных через $this->set() для использования в моем шаблоне представления.

В моем UsersController есть код, который выглядит примерно так:

public function beforeFilter() {
  parent::beforeFilter();
  if (userDeniedAccess()) {
    throw new ForbiddenException();
  }
}

где гипотетическая функция userDeniedAccess() инкапсулирует мои проверки авторизации.

Это все работает нормально, и я получаю ошибку 403, когда ожидаю этого. Однако, когда генерируется исключение, переменные представления, которые были установлены в AppController::beforeFilter(), больше не устанавливаются, что приводит к ошибкам из моего шаблона представления. Когда исключение не выброшено, переменные установлены правильно.

Я могу закодировать пропущенные переменные, если нужно, но мне бы очень хотелось знать, что вызывает такое поведение. И мой UsersController, и CakeErrorController расширяются AppController. Естественно, я ожидаю, что когда генерируется исключение и создается экземпляр CakeErrorController, он генерирует те же переменные представления для меня.

Однако кажется, что метод Controller::startupProcess() (который включает в себя вызов beforeFilter()) никогда не вызывается на CakeErrorController. Насколько я понимаю, это делается диспетчером для обычных запросов, но жизненный цикл контроллера ошибок отличается.

Я видел описания ( как этот ) аналогичного поведения в CakePHP 1.3, но, конечно, код обработки ошибок CakePHP был полностью переработан в 2.0.

Так что либо:

  1. Это ошибка в обработке исключений по умолчанию в CakePHP,
  2. Поведение такое, как задумано, и я просто не понимаю, или
  3. Я схожу с ума.

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

Спасибо!

РЕДАКТИРОВАТЬ: Установка переменных представления в beforeRender() действительно решает мою проблему. Тем не менее, я все еще задаюсь вопросом, является ли намеренным, что beforeFilter() никогда не вызывается на CakeErrorController.

Ответы [ 2 ]

4 голосов
/ 28 января 2012

Поместите вызовы на $this->set() в beforeRender() обратном вызове. Таким образом, они всегда будут установлены, даже если вы выбросите исключение.

У меня была такая же проблема с некоторыми пользовательскими переменными макета, так как с DebugKit моя страница была бы заполнена необъявленными переменными предупреждениями всякий раз, когда была какая-либо ошибка. Использование beforeRender() вместо этого исправило это.

3 голосов
/ 09 февраля 2012

вы можете перезаписать CakeErrorController.php, скопировав его в App / Controller / и затем добавьте parent :: beforeFilter () в конструктор.

...