2012-01-27 16 views
8

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:

  1. Jest to błąd w obsłudze wyjątków domyślne CakePHP, w
  2. Zachowanie jest zgodnie z przeznaczeniem, a ja po prostu nie rozumiem, albo
  3. 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

+1 za autodiagnostykę "Mogę być szalona". –

Odpowiedz

4

Put połączeń do $this->set() w beforeRender() zwrotnego. W ten sposób będą zawsze ustawiane, nawet jeśli rzucisz wyjątek.

miałem ten sam problem ja z pewnych zmiennych niestandardowy układ, jak z DebugKit mojej strony byłaby wypełniona niezadeklarowanych ostrzeżeń zmiennych gdy istnieje jakiś rodzaj błędu. Zamiast tego naprawiłem go za pomocą beforeRender().

+0

+1 za wnikliwą odpowiedź - ale nie jestem pewien, czy to zadziała, ponieważ 'beforeRender()' działa po logice akcji. Ponieważ sprawdzam autoryzację, nie chcę, aby logika działania działała, jeśli się nie uda. – eaj

+0

Po drugie, to nie ma sensu. Oczywiście mogę rzucić mój wyjątek w 'beforeFilter()' i ustawić zmienne widoku w 'beforeRender()'. Zaakceptowałem tę odpowiedź, ponieważ rozwiązuje ona mój natychmiastowy problem, ale nadal chciałbym wiedzieć, czy jest to błąd, że 'beforeFilter()' nie jest wywoływany na kontrolerze błędów. – eaj

3

można zastąpić CakeErrorController.php, kopiując go do App/Controller/ , a następnie dodać parent :: beforeFilter() do konstruktora.

+0

Dzięki, to na pewno przydatna opcja. Czuje się jednak trochę hackish. W tym momencie mam swój kod robiący to, co powinien. Nadal chciałbym zrozumieć, dlaczego proces obsługi wyjątków nigdy nie wywołuje 'startupProcess()' na 'CakeErrorController' w taki sam sposób, w jaki dyspozytor wywołuje go na innych kontrolerach. – eaj

Powiązane problemy