Laravel 5.2 – eigene Exception schreiben

Heute zeige ich dir, wie man in Laravel 5.2 eine eigene Exception einbaut und diese korrekt abfängt. Auch bei diesem Vorhaben unterstützt uns Laravel mit vordefinierten Handlern.

Beispielhaft wollen wir eine Exception werfen und abfangen während wir einem Benutzer eine Rolle/ Benutzergruppe zuweisen.

die eigene Exception Klasse

Zuerst müssen wir eine Klasse für unsere eigene Exception schreiben.  Dazu wechselst du in das Verzeichnis app/Exceptions/. Dort erstellst du eine Klasse mit folgendem Inhalt:

Wie du siehst, reicht es, eine leere Klasse zu erstellen. Wichtig ist, dass die eigene Exception die php-eigene Exception-Klasse mittels extends \Exception erweitert, also auch alle Methoden und Attribute von dieser Eltern-Klasse erbt.

Wenn dich interessiert, welche Methoden und Attribute das sind, kannst du auf php.net mehr darüber erfahren.

Nun brauchen wir noch ein Script, welches die Exception wirft. In meinem Beispiel geschieht das in einer Methode des User-Models:

Im Folgenden müssen wir uns entscheiden, ob wir den Laravel internen Exception-Handler nutzen oder nicht.

 

Laravel Exception Handler

Zuerst gehe ich auf den Laravel Exception Handler ein. Dazu öffnen wir die Datei app\Exceptions\Handler.php. Für dieses Beispiel wollen wir eine view ausgeben, welche den User über den Fehler informiert (zugegeben, das ist nicht optimal, zeigt aber die Anwendungsmöglichkeit).

Dazu erweitern wir die Methode render wie folgt:

Wie du siehst, wird vom Handler geprüft, ob die geworfene Exception ein Instanz unserer eigenen Exception ist. Falls ja, wird ein response zurückgegeben und eine eigene View angezeigt. Die view-Methode nimmt dabei drei Werte entgegen. Der erst ist der Name der View. In unserem Beispiel liegt diese in resources\views\errors\custom.blade.php. Als nächstes übergeben wir der Methode ein Array mit Daten. Auf diese Daten können wir dann in der View zugreifen (siehe weiter unten). Als dritten und letzten Parameter übergeben wir den Http-Statuscode (in diesem Fall für einen internal server error). Eine Liste mit möglichen Status-Codes findest du auf Wikipedia.

Nun zur View custom.blade.php:

Wie du siehst greifen wir mit {{ $message }} auf den Wert aus dem Array in der view-Methode zurück. Wenn die geschweiften Klammer wundern, dem sei gesagt, dass es sich dabei um eine Funktion der Laravel-internen Template-Engine Blade handelt. Die geschweiften Klammern stehen für eine ganz normale echo-Anweisung und geben den Inhalt der Variablen escaped aus (mehr dazu in der Laravel-Dokumentation).

Nun brauchen wir noch ein Script, welches die Exception verursacht. Dies kann beispielsweise in einem deiner Controller geschehen.

Unsere eigene Exception wird geworfen und vom Handler aufgefangen. Daraufhin wird uns die passende View ausgegeben:

Ausgegebene View nach verursachter eigener Exception

 

Exception selbst abfangen

Natürlich macht es in diesem Beispiel mehr Sinn, die eigene geworfene Exception selbst abzufangen. Dazu müssen wir lediglich den Code im Controller in eine try - catch-Anweisung packen:

Wie du siehst, haben wir die attachRole()-Anweisung in einen try-Block gepackt und fangen anschließen selbst die Exception mit catch(UserAlreadyHasRole $e) und leiten den Nutzer zurück zum Ausgangspunkt. Die übernimmt die Anweisung return back()->with('danger', $e->getMessage));. Die with()-Anweisung generiert eine Flash-Message, welche dem Nutzer dann angezeigt wird und ihn somit auf den Fehler hinweist (mehr dazu in der Laravel-Dokumentation).

 

Das war es auch schon. Ich hoffe, dass ich dir mit dem kurzen Tutorial weiterhelfen konnte und freue mich über dein Feedback.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.