Pracowałem z CakePHP 1.3, ale jest to moja pierwsza przygoda z wyjątkami CakePHP 2.0 i PHP, więc nie przejmujcie się, jeśli moje pytanie wydaje się nie na miejscu.CakePHP 2.0 - beforeFilter() nie działa na CakeErrorController?
W moim AppController
's beforeFilter()
ustawiam kilka zmiennych poprzez $this->set()
do użycia w moim szablonie widoku.
W moim UsersController
Mam kodu, który wygląda mniej więcej tak:
public function beforeFilter() {
parent::beforeFilter();
if (userDeniedAccess()) {
throw new ForbiddenException();
}
}
gdzie hipotetyczna funkcja userDeniedAccess()
kapsułkuje czeki autoryzacji.
To wszystko działa dobrze, a pojawia się błąd 403, kiedy się tego spodziewam. Jednak po zgłoszeniu wyjątku zmienne widoku ustawione w AppController::beforeFilter()
nie są już ustawione, co powoduje błędy z mojego szablonu widoku. Kiedy wyjątek jest , a nie, zmienne są ustawione poprawnie.
Mogę kod wokół brakujących zmiennych, jeśli muszę, ale naprawdę chciałbym wiedzieć, co powoduje to zachowanie. Zarówno mój UsersController
i CakeErrorController
rozszerzenie AppController
. Oczywiście oczekuję, że po wygenerowaniu wyjątku i utworzeniu instancji CakeErrorController
wygeneruje on dla mnie te same zmienne widoku.
Jednak wydaje się, że metoda Controller::startupProcess()
(która obejmuje wywołanie) nigdy nie zostanie wywołana na CakeErrorController
. Jak rozumiem, jest to wykonywane przez dyspozytora dla zwykłych żądań, ale cykl życia kontrolera błędów jest inny.
Widziałem opisy (like this one) o podobnym działaniu w CakePHP 1.3, ale oczywiście kod obsługi błędów CakePHP został całkowicie zmieniony w wersji 2.0.
Więc albo:
- Jest to błąd w obsłudze wyjątków domyślne CakePHP, w
- Zachowanie jest zgodnie z przeznaczeniem, a ja po prostu nie rozumiem, albo
- jadę orzechy.
Wiem, że nie możesz pomóc w przypadku 3, ale jeśli jedno z dwóch pierwszych dotyczy, będę wdzięczny za wejście od kogoś, kto wie więcej niż ja.
Dzięki!
EDYCJA: Ustawienie zmiennych widoku w beforeRender()
rozwiązuje mój problem. Jednak nadal zastanawiam się, czy jest celowe, aby beforeFilter()
nigdy nie został wywołany na CakeErrorController
.
+1 za autodiagnostykę "Mogę być szalona". –