Porozumění zpracování výjimek v systému Laravel

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 zjednod...

Poptat web

24. 12. 2024

Porozumění zpracování výjimek v systému Laravel

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=true zobrazit podrobné chybové zprávy.
  • Výroba: Vždy nastavte APP_DEBUG=false aby 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 false v 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 render metoda 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í:

  1. Chcete-li přizpůsobit výchozí šablony chyb, publikujte je pomocí:
    php artisan vendor:publish --tag=laravel-errors
  2. Přidejte vlastní obsah do 404.blade.php pohled:
    <h2>{{ $exception->getMessage() }}</h2>
    <p>Sorry, the page you’re looking for doesn’t exist.</p>
  3. 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í.

Původní článek publikoval Nabil Hassen.