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