Ajax-Fehlerbehandlung in CakePHP

8

Ich möchte etwas sehr ähnliches tun dies aber in der CakePHP-Welt für AJAX-Anfragen. Im Moment mache ich das:

%Vor%

Es basiert auf dies . Diese Lösung erlaubt es mir jedoch nicht, eine benutzerdefinierte Nachricht wie im Rails-Beispiel aufzunehmen, sodass ich in meiner clientseitigen Fehlerbehandlungsroutine die in der 500-Fehlerantwort enthaltene Nachricht anzeigen kann.

Wie würde ich die gleiche Funktionalität in CakePHP wie das Ruby on Rails-Beispiel implementieren?

    
paul smith 20.07.2012, 19:14
quelle

3 Antworten

0

Sie können CakeExceptions wie im Cookbook erklärt verwenden: Ссылка ABER Wenn Sie Ihre benutzerdefinierten Nachrichten verwenden möchten, habe ich keine andere Möglichkeit gefunden als debug = 1 in Ihrem Produktionsmodus zu verwenden: (

Hier ist mein Ansatz mit eingebauten Methoden:

In Ihrem Controller:

%Vor%

Ändere die Fehlervorlage so, dass sie nur den Fehler ausgibt, wenn sie in AJAX-Aufrufen in /app/View/Errors/error500.ctp:

verwendet wird %Vor%

Sie können den zurückgegebenen Text dann in Ihrem AJAX analysieren. Hier sind die jQuery Teile, die ich benutze:

%Vor%

Hoffe das hilft:)

Wenn jemand eine Idee hat, wie man die benutzerdefinierten Fehler im Produktionsmodus verwendet (ohne den Debug-Modus zu überschreiben) würde ich mich sehr freuen!

    
lorem monkey 03.08.2012, 11:22
quelle
7

Wie oben erwähnt, sind Exceptions die Methode, um einen Fehler bei einer AJAX-Anfrage in CakePHP zurückzugeben. Hier ist meine Lösung, um besser zu kontrollieren, wie der Fehler aussieht. Wie oben verwende ich einen benutzerdefinierten Ausnahme-Renderer, aber keine benutzerdefinierte Ausnahme. Die Standardfehlerantwort ist ein JSON-Objekt wie folgt:

%Vor%

I fast wie die Art und Weise, wie der Standard-Renderer AJAX-Fehler verarbeitet; Ich möchte es nur ein wenig optimieren:

%Vor%

Dann in bootstrap.php:

%Vor%

Also hier ist, wie es funktioniert:

  • Angenommen, ich möchte in meiner Fehlerantwort ein neues CSRF-Token zurückgeben. Wenn mein vorhandenes Token abgelaufen ist, bevor die Ausnahme ausgelöst wurde, werde ich beim nächsten Versuch der Anfrage nicht gesperrt. Weitere Informationen zu CSRF finden Sie in der Sicherheitskomponente Schutz.
  • Erstellen Sie eine neue Klasse in App / Lib / Error. Sie können den Standard-Renderer erweitern oder nicht. Da ich nur ein paar kleine Dinge ändern möchte, und um das Beispiel einfach zu halten, erweitere ich es.
  • Überschreiben Sie die Methoden, mit denen der Standardrenderer das JSON-Objekt erstellt, das zurückgegeben wird. Dies geschieht über den Request Handler Component und entspricht den Best Practices. Tatsächlich macht der Standard-Renderer das Gleiche.
  • Neue private Methode, um die Dinge trocken zu halten.
  • Meine Lösung für das Problem, keine benutzerdefinierten Fehlermeldungen in der Produktion zu erhalten, besteht darin, einen optionalen Konfigurationsschlüssel hinzuzufügen. Standardmäßig zeigt diese Klasse die generischen Nachrichten in der Produktion an, wenn Sie jedoch Debug auf 0 gesetzt haben und die spezifischen Fehlermeldungen möchten: Configure::write('detailed_exceptions', 1);
  • Fügen Sie der Antwort das neue Token hinzu, wenn es existiert. In meinem Fall habe ich Controller::set bereits für das neue Token in der beforeFilter-Methode von AppController aufgerufen, sodass es in $this->controller->viewVars verfügbar ist. Es gibt wahrscheinlich Dutzende anderer Möglichkeiten, dies zu erreichen.

Nun sieht Ihre Antwort so aus:

%Vor%

Alle zusätzlichen Daten eines beliebigen Typs können zum Array hinzugefügt werden, das für das gleiche Ergebnis an Controller::set übergeben wird.

    
threeve 10.07.2013 18:58
quelle
2

Ich habe auch Probleme mit benutzerdefinierten Ausnahmen und Fehlercodes bei der Verwendung von Ajax-Anfragen (jQuery Mobile in meinem Fall). Hier ist die Lösung, die ich entwickelt habe, ohne den Debug-Modus zu überschreiben. Es wirft benutzerdefinierte Fehler im Entwicklungsmodus und optional im Produktionsmodus. Ich hoffe es hilft jemandem:

AppExceptionRenderer.php:

%Vor%

Sie können Configure::read('debug') > 0 weglassen, wenn Sie die Ausnahme im Debug-Modus anzeigen möchten. Die Ansicht errorjson.ctp befindet sich in 'Error / errorjson.ctp':

%Vor%

In diesem Fall heißt meine Ausnahme

  

TestException

und ist wie folgt definiert:

%Vor%

Wo ich einen benutzerdefinierten Fehlercode 2, $code = 2 , für meine JSON-Antwort habe. Die Ajax-Antwort wird einen Fehler 500 mit folgenden JSON-Daten auslösen:

%Vor%

Natürlich müssen Sie auch die Ausnahme von Ihrem Controller werfen:

%Vor%

und fügen Sie den Ausnahme-Renderer Ссылка

Dies ist vielleicht etwas außerhalb des Gültigkeitsbereichs, aber um die Ajax-Fehlerantwort in JQuery zu behandeln, verwende ich:

%Vor%     
Yoggi 14.01.2013 12:45
quelle

Tags und Links