Я работал с 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.
Итак, либо:
Я знаю, что вы не можете помочь в третьем случае, но если применимы первые два, я был бы признателен за помощь от того, кто знает больше, чем я.
Спасибо!
EDIT: Установка переменных представления в beforeRender()
действительно решает мою проблему. Однако мне все еще интересно, намеренно ли то, что beforeFilter()
никогда не вызывается на CakeErrorController
.