Ich habe mit CakePHP 1.3 gearbeitet, aber dies ist mein erster Ausflug in CakePHP 2.0 und PHP Ausnahmen, also ertragen Sie mit mir, wenn meine Frage wortreich erscheint.
In meinem AppController
's beforeFilter()
habe ich ein paar Variablen über $this->set()
für die Verwendung in meiner Ansichtsvorlage festgelegt.
In meinem UsersController
habe ich Code, der ungefähr so aussieht:
wobei die hypothetische Funktion userDeniedAccess()
meine Berechtigungsprüfungen einschließt.
Das alles funktioniert gut, und ich bekomme den Fehler 403, wenn ich es erwarte. Wenn die Ausnahme ausgelöst wird, werden die Ansichtsvariablen, die in AppController::beforeFilter()
festgelegt wurden, nicht mehr festgelegt, was zu Fehlern in meiner Ansichtsvorlage führt. Wenn die Ausnahme nicht ausgelöst wird, werden die Variablen korrekt festgelegt.
Ich kann die fehlenden Variablen codieren, wenn ich muss, aber ich würde gerne wissen, was dieses Verhalten verursacht. Sowohl mein UsersController
als auch das CakeErrorController
verlängern AppController
. Natürlich erwarte ich, dass, wenn die Ausnahme ausgelöst wird und die CakeErrorController
instanziiert wird, sie die gleichen Ansichtsvariablen für mich erzeugt.
Es scheint jedoch, dass die Methode Controller::startupProcess()
(die den Aufruf von beforeFilter()
enthält) niemals für CakeErrorController
aufgerufen wird. Wie ich es verstehe, wird dies vom Dispatcher für regelmäßige Anfragen erledigt, aber der Lebenszyklus des Fehler-Controllers ist anders.
Ich habe Beschreibungen gesehen ( wie diese >) ähnliches Verhalten in CakePHP 1.3, aber natürlich wurde CakePHPs Fehlerbehandlungscode in 2.0 komplett überarbeitet.
Also entweder:
Ich weiß, dass Sie nicht mit Fall 3 helfen können, aber wenn eines der ersten zwei zutrifft, würde ich mich über jemanden freuen, der mehr weiß als ich.
Danke!
BEARBEITEN: Das Setzen der View-Variablen in beforeRender()
löst mein Problem. Ich frage mich aber immer noch, ob beforeFilter()
niemals auf CakeErrorController
aufgerufen wird.
Versetzen Sie die Aufrufe in $this->set()
in den beforeRender()
-Rückruf. Auf diese Weise werden sie immer eingestellt, auch wenn Sie eine Ausnahme auslösen.
Ich hatte das selbe Problem mit einigen benutzerdefinierten Layoutvariablen, da mit DebugKit meine Seite mit nicht deklarierten Variablenwarnungen gefüllt wäre, wenn irgendein Fehler auftrat. Verwenden Sie beforeRender()
anstatt es zu reparieren.
Tags und Links exception-handling cakephp cakephp-2.0