CakePHP 2.0 - beforeFilter () läuft nicht auf cakeErrorController?

8

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:

%Vor%

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:

  1. Dies ist ein Fehler in CakePHPs Standard-Ausnahmebehandlung,
  2. Das Verhalten ist wie beabsichtigt und ich verstehe es einfach nicht, oder
  3. Ich werde verrückt.

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.

    
eaj 27.01.2012, 23:09
quelle

2 Antworten

4

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.

    
mrlee 27.01.2012, 23:34
quelle
3

Sie können die CakeErrorController.php überschreiben, indem Sie sie in App / Controller / kopieren und fügen Sie dann parent :: beforeFilter () in den Konstruktor ein.

    
csx 09.02.2012 12:09
quelle