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