Zpracování výjimek je nezbytnou součástí každé aplikace, která vývojářům umožňuje elegantně řešit chyby a zajistit uživatelům bezproblémové používání. Laravel tento proces zjednodušuje tím, že nabízí robustní systém pro zpracování chyb a výjimek. V této příručce prozkoumáme krok za krokem, jak využít možnosti Laravelu v oblasti zpracování výjimek způsobem, který je vhodný pro začátečníky.
Pochopení základů zpracování výjimek v systému Laravel
Laravel je dodáván s předkonfigurovaným robustním mechanismem pro zpracování chyb a výjimek. Díky tomu nemusíte začínat od nuly.
Jádrem této funkce je $exceptions objekt, který se nachází v bootstrap/app.php který řídí, jak jsou výjimky nahlášeno na . (zaznamenané nebo odeslané externí službě) a vykresleno (zobrazuje se uživatelům).
Nastavení ladění
Laravel používá APP_DEBUG proměnné v .env určit, kolik informací o chybách se má zobrazit:
- Místní rozvoj: Sada
APP_DEBUG=truezobrazit podrobné chybové zprávy. - Výroba: Vždy nastavte
APP_DEBUG=falseaby nedošlo k odhalení citlivých informací.
Aktualizace .env soubor:
APP_DEBUG=true
Výjimky z hlášení
Laravel automaticky zaznamenává výjimky na základě konfigurace protokolování. Chcete-li toto chování přizpůsobit, můžete definovat logiku hlášení specifickou pro výjimky.
Příklad: Hlášení vlastní výjimky
In bootstrap/app.php:
->withExceptions(function (Exceptions $exceptions) { $exceptions->report(function (InvalidOrderException $e) { // Custom reporting logic })->stop();});
- Použijte
->stop()zabránit výchozímu protokolování. - Návrat na
falsev uzávěrce zcela vynechat protokolování.
Přidání globálního kontextu do protokolů
Aby byly protokoly smysluplnější, můžete do nich zahrnout kontextové údaje:
Globální kontext
Definujte globální údaje, které se mají objevit v každém záznamu protokolu:
In bootstrap/app.php:
->withExceptions(function (Exceptions $exceptions) { $exceptions->context(fn () => ['user_id' => auth()->id()]);});
Kontext specifický pro výjimky
Přidejte kontext ke konkrétním výjimkám definováním kontextové metody ve své třídě výjimek:
public function context(): array{ return ['order_id' => $this->orderId];}
Výjimky při vykreslování
Ve výchozím nastavení Laravel převádí výjimky na odpovědi HTTP. Toto chování můžete pro konkrétní výjimky přepsat.
Příklad: Vlastní vykreslování pro neplatné objednávky
In bootstrap/app.php:
use App\Exceptions\InvalidOrderException;use Illuminate\Http\Request; ->withExceptions(function (Exceptions $exceptions) { $exceptions->render(function (InvalidOrderException $e, Request $request) { return response()->view('errors.invalid-order', [], 500); });});
- Na stránkách
rendermetoda může také zpracovávat vestavěné výjimky, jako např.NotFoundHttpException.
Příklad: Pro odpovědi API
Renderování výjimek jako JSON:
$exceptions->render(function (NotFoundHttpException $e, Request $request) { return $request->is('api/*') ? response()->json(['message' => 'Not found'], 404) : null;});
Vytváření vlastních chybových stránek HTTP
Laravel umožňuje vytvářet vlastní chybové stránky pro různé stavové kódy HTTP. Přizpůsobení chybové stránky 404:
Kroky pro přizpůsobení:
- Chcete-li přizpůsobit výchozí šablony chyb, publikujte je pomocí:
php artisan vendor:publish --tag=laravel-errors
- Přidejte vlastní obsah do
404.blade.phppohled:<h2>{{ $exception->getMessage() }}</h2><p>Sorry, the page you’re looking for doesn’t exist.</p> - Otestujte stránku navigací na neexistující trasu.
Můžete také definovat nouzové šablony pro skupiny chyb, jako např. 4xx.blade.php pro všechny chyby 4xx.
Používání výjimek, které lze nahlásit a vykreslit
Namísto globálního definování logiky hlášení a vykreslování ji můžete implementovat přímo ve vlastních třídách výjimek.
Příklad: Vlastní třída výjimek
Vytvoření nové výjimky:
php artisan make:exception InvalidOrderException
In App\Exceptions\InvalidOrderException:
namespace App\Exceptions; use Exception;use Illuminate\Http\Request;use Illuminate\Http\Response; class InvalidOrderException extends Exception{ public function report(): void { // Custom reporting logic } public function render(Request $request): Response { return response()->view('errors.invalid-order', [], 500); }}
Výjimky z přiškrcení
Aby se zabránilo zahlcení protokolů duplicitními chybami, umožňuje Laravel omezit počet hlášených výjimek.
Příklad: Výjimky z přiškrcení
In bootstrap/app.php:
use Illuminate\Support\Lottery; ->withExceptions(function (Exceptions $exceptions) { $exceptions->throttle(fn () => Lottery::odds(1, 1000));});
- Tím je zajištěno, že bude zaznamenána pouze jedna z každých 1000 stejných výjimek.
Ignorování výjimek
Určité výjimky můžete z hlášení vyloučit přidáním do pole dontReport seznam nebo provádění ShouldntReport rozhraní.
Příklad: Přidání výjimek do dontReport Seznam
$exceptions->dontReport([ InvalidOrderException::class,]);
Příklad: Označení výjimek jako neohlašovaných
namespace App\Exceptions; use Exception;use Illuminate\Contracts\Debug\ShouldntReport; class CustomException extends Exception implements ShouldntReport{ // ...}
Zpracování výjimek HTTP
Chcete-li programově spouštět konkrétní chyby HTTP, použijte příkaz abort helper:
Příklad: Spuštění chyby 404
abort(404, 'Page not found');
Závěr
Systém Laravel pro zpracování výjimek je navržen tak, aby byl flexibilní a umožňoval vývojářům přizpůsobit a řídit hlášení chyb a vykreslování podle potřeby. Zvládnutím těchto technik můžete zajistit, že vaše aplikace bude chyby zpracovávat elegantně a zároveň zachová bezproblémové uživatelské prostředí.