Overzicht
Wanneer je een Laravel-project aanmaakt, is de afhandeling van fouten en exceptions al voor je geconfigureerd. Aanpassen doe je met dewithExceptions-methode in bootstrap/app.php.
De exception-afhandelingsflow
Zo verloopt de stroom van het optreden van een exception tot de response die naar de client wordt teruggestuurd.$exceptions-object dat aan de withExceptions-closure wordt doorgegeven, is een instantie van Illuminate\Foundation\Configuration\Exceptions en beheert de exception-afhandeling van je hele applicatie.
Debugconfiguratie
Dedebug-optie in config/app.php bepaalt hoeveel foutinformatie wordt getoond.
Standaard wordt de waarde van de omgevingsvariabele APP_DEBUG uit .env gebruikt.
Exceptions rapporteren
Het rapporteren van exceptions houdt in dat je exceptions logt of doorstuurt naar externe services zoals Laravel Nightwatch, Sentry of Flare. Standaard worden ze gelogd op basis van de configuratie inconfig/logging.php.
Eigen rapportagecallbacks
Wil je per soort exception een andere rapportagelogica, geef dan een closure door aan dereport-methode.
Laravel bepaalt het soort exception op basis van de type-hint van de closure.
stop() aan of geef false terug.
De report()-helper
Wil je alleen een exception rapporteren zonder een foutpagina te tonen, gebruik dan de report()-helper.
Dubbele rapportages voorkomen
Als dezelfde exception-instantie meerdere keren aanreport() wordt doorgegeven, kunnen er dubbele logregels ontstaan.
Met dontReportDuplicates() wordt dezelfde instantie alleen de eerste keer gelogd.
Globale logcontext
Wil je aan alle exceptionlogs gemeenschappelijke informatie toevoegen, gebruik dan decontext-methode.
Indien beschikbaar wordt het ID van de huidige gebruiker automatisch toegevoegd.
Een context()-methode toevoegen aan een exceptionklasse
Als je op de exceptionklasse zelf een context()-methode definieert, kun je contextinformatie specifiek voor die exception in de logs opnemen.
Het logniveau wijzigen
Wil je een specifieke exception op een specifiek logniveau loggen, gebruik dan delevel-methode.
Exception-rapportages throttlen
Als er grote aantallen exceptions optreden, kun je met dethrottle-methode het aantal rapportages beperken.
Limit.
Exceptions renderen
Renderen is het omzetten van een exception naar een HTTP-response. Standaard genereert Laravel automatisch een passende response, maar je kunt dit aanpassen.Eigen rendercallbacks
Geef een closure door aan derender-methode om een exception naar een response om te zetten.
NotFoundHttpException) overschrijven.
Als de closure geen waarde teruggeeft, wordt de standaardrendering gebruikt.
Automatische JSON/HTML-detectie
Laravel bepaalt automatisch of het HTML of JSON teruggeeft op basis van deAccept-header van het request.
Wil je deze beslislogica aanpassen, gebruik dan shouldRenderJsonWhen.
De volledige response aanpassen
Met derespond-methode kun je de gegenereerde response verder bewerken.
Eigen exceptionklassen
Je kunt eigen exceptionklassen maken in de mapapp/Exceptions/.
Als je de methoden report() en render() definieert, worden ze automatisch aangeroepen zonder dat je configuratie in bootstrap/app.php hoeft te schrijven.
Een exceptionklasse maken
1
Maak de exceptionklasse aan
2
Implementeer report() en render()
In de
report()-methode kun je dependency injection via type-hints gebruiken. De servicecontainer van Laravel lost ze automatisch op.De ShouldntReport-interface
Voor exceptions die geen rapportage nodig hebben, implementeer je de ShouldntReport-interface.
Exceptions die deze interface implementeren, worden nooit gerapporteerd.
Exceptions gooien
De abort()-helper
Vanaf elke plek in je applicatie kun je een HTTP-foutresponse laten optreden.
abort_if() / abort_unless()
Helpers om voorwaardelijk een exception te gooien.
Exceptions globaal beheren
Specifieke exceptions negeren
MetdontReport geef je exceptions op die niet gerapporteerd worden. Eigen renderlogica blijft wel gewoon werken.
dontReportWhen.
Laravel negeert standaard automatisch een aantal exceptions, zoals 404-fouten, ongeldige CSRF-tokens (419) en niet-overeenkomende origins (403).
Door Laravel genegeerde exceptions weer inschakelen
Om exceptions die standaard worden genegeerd weer te laten rapporteren, gebruik jestopIgnoring.
HTTP-foutpagina’s
In Laravel kun je per HTTP-statuscode eigen foutviews definiëren.Eigen foutviews maken
Maak in de mapresources/views/errors/ Blade-templates aan met de statuscode als bestandsnaam.
$exception toegang tot de foutinformatie.
De standaardfouttemplates publiceren
Wil je de standaardfoutpagina’s van Laravel als startpunt voor aanpassing gebruiken, haal ze dan op metvendor:publish.
Fallback-foutpagina’s
Als fallback voor statuscodes zonder bijbehorende view kun je4xx.blade.php en 5xx.blade.php aanmaken.
Praktijkvoorbeeld: een API-exceptionhandler
In applicaties die een API aanbieden, moeten exceptions altijd als JSON worden teruggegeven. Hieronder een implementatievoorbeeld waarbij API-fouten centraal worden beheerd inbootstrap/app.php.
Een eigen API-exceptionklasse implementeren
Met een basisexceptionklasse speciaal voor je API kun je op elk endpoint een uniforme foutresponse teruggeven.Samenvatting
Samenvatting van exception-rapportage
Samenvatting van exception-rapportage
Samenvatting van exception-rendering
Samenvatting van exception-rendering
Samenvatting van HTTP-foutpagina's
Samenvatting van HTTP-foutpagina's
- Bestanden zoals
resources/views/errors/404.blade.phpworden automatisch gebruikt zodra je ze aanmaakt - Via de variabele
$exceptionheb je toegang tot de foutdetails - Met
php artisan vendor:publish --tag=laravel-errorshaal je de standaardtemplates op - Met
4xx.blade.php/5xx.blade.phpdefinieer je fallback-pagina’s
Best practices voor productie
Best practices voor productie
- Zet altijd
APP_DEBUG=falseen toon stacktraces niet aan gebruikers - Koppel externe fouttrackingservices zoals Sentry of Flare om fouten centraal te beheren
- Gebruik
throttle()om logoverstroming te voorkomen bij grote aantallen exceptions - Handhaaf een consistent JSON-foutresponseformaat op API-endpoints