CakePHP 2.0 - beforeFilter() не выполняется на cakeErrorController?

Я работал с 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. Я схожу с ума.

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

Спасибо!

EDIT: Установка переменных представления в beforeRender() действительно решает мою проблему. Однако мне все еще интересно, намеренно ли то, что beforeFilter() никогда не вызывается на CakeErrorController.

8
задан eaj 31 January 2012 в 20:56
поделиться