aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Webontwikkeling

Laravel Middleware: wat het is en hoe je het schrijft

Laravel middleware is een filterlaag die draait voordat een HTTP-verzoek de binnenste delen van je applicatie bereikt en voordat het antwoord teruggaat naar de browser. Zie het als een reeks poorten tussen het verzoek en je controller: elke poort inspecteert het verzoek en kan het stoppen, aanpassen of doorgeven aan de volgende poort. Vrijwel alles zoals authenticatie, sessiebeheer, CSRF-bescherming en taaldetectie wordt met middleware gedaan.

De rol van middleware in de request/response-keten

In Laravel reist elk binnenkomend verzoek door een "pipeline". Die pipeline werkt als een ui: het verzoek gaat van buiten naar binnen door elke laag tot het de controller bereikt, en het antwoord reist daarna in omgekeerde richting weer naar buiten door dezelfde lagen. Daardoor kan één middleware code uitvoeren zowel voor het verzoek als na het antwoord.

  • Code die ervoor draait: controleert het verzoek voordat het de controller bereikt (bijvoorbeeld: is de gebruiker ingelogd?).
  • Code die erna draait: doet werk zodra het antwoord is gemaakt, zoals een header toevoegen of een logregel schrijven.

De volgorde in de keten is belangrijk. De middleware die de sessie start, moet bijvoorbeeld draaien vóór elke verificatie die van die sessie afhangt. Laravel stelt een verstandige standaardvolgorde in, maar in je eigen middleware moet je letten op de plek in de stack.

Hoe middleware werkt: de basisstructuur

Elke middleware is een eenvoudige class met een handle-methode. Die methode krijgt twee parameters: het binnenkomende $request en een closure genaamd $next. Het aanroepen van $next($request) geeft het verzoek door aan de volgende schakel in de keten.

public function handle(Request $request, Closure $next)
{
    // Logica vóór het verzoek

    $response = $next($request);

    // Logica na het antwoord

    return $response;
}

Alles wat je voor de regel $next($request) schrijft, draait voordat het verzoek de controller bereikt; alles erna draait terwijl het antwoord terugreist. Wil je het verzoek helemaal niet laten doorgaan (bijvoorbeeld bij geweigerde toegang), dan geef je gewoon een antwoord terug zonder $next aan te roepen.

Je eigen middleware schrijven

De meest praktische manier om een nieuwe middleware te maken is het Artisan-commando:

php artisan make:middleware EnsureTokenIsValid

Dit genereert het bestand app/Http/Middleware/EnsureTokenIsValid.php. Stel dat we elk verzoek willen weigeren dat geen geldig token in een bepaalde header bevat:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class EnsureTokenIsValid
{
    public function handle(Request $request, Closure $next): Response
    {
        if ($request->header('X-Api-Token') !== config('services.api.token')) {
            abort(403, 'Ongeldig token.');
        }

        return $next($request);
    }
}

Als het token niet overeenkomt, breekt abort(403) de keten meteen af en bereikt het verzoek nooit een controller. Komt het wel overeen, dan gaat de stroom verder met $next($request).

Middleware registreren (Laravel 11 en 12)

Sinds Laravel 11 is de registratie van middleware verhuisd van het oude bestand app/Http/Kernel.php naar bootstrap/app.php. Er zijn drie hoofdmanieren:

  • Globale middleware: toegepast op elk verzoek.
  • Groep-middleware: toegevoegd aan routegroepen zoals web of api.
  • Middleware met alias: toegewezen aan losse routes met ->middleware('alias').
// bootstrap/app.php
return Application::configure(basePath: dirname(__DIR__))
    ->withMiddleware(function (Middleware $middleware) {
        // Definieer een alias voor gebruik op losse routes
        $middleware->alias([
            'token' => \App\Http\Middleware\EnsureTokenIsValid::class,
        ]);

        // Toevoegen aan de web-groep
        $middleware->web(append: [
            \App\Http\Middleware\SetLocale::class,
        ]);
    })
    ->create();

Zodra de alias is gedefinieerd, gebruik je hem op routes zo:

Route::get('/dashboard', DashboardController::class)
    ->middleware('token');

Let op: gebruik je nog Laravel 10 of ouder, dan doe je dezelfde registraties in de arrays $middlewareAliases en $middlewareGroups in app/Http/Kernel.php.

Middleware met parameters

Middleware kan ook extra argumenten aannemen. De ingebouwde autorisatie- en rolcontroles van Laravel werken precies op dit principe. Je voegt parameters toe aan de handle-methode na $next:

public function handle(Request $request, Closure $next, string $role): Response
{
    if (! $request->user()?->hasRole($role)) {
        abort(403);
    }

    return $next($request);
}

Op de route geef je de waarde door na een dubbele punt:

Route::get('/admin', AdminController::class)
    ->middleware('role:editor');

Veelgemaakte fouten

  • Vergeten $next($request) terug te geven: geeft de methode geen antwoord terug, dan krijg je een lege pagina of een fout. Tenzij je vroegtijdig afsluit, schrijf altijd return $next($request).
  • Verkeerde volgorde: draait sessie-afhankelijk werk vóór de sessie-middleware, dan krijg je onverwachte resultaten.
  • Te zware taken: middleware draait bij elk verzoek; gebruik databasequery's en externe API-calls hier met mate en cache ze waar mogelijk.

Veelgestelde vragen

Wat is het verschil tussen middleware en een controller?

Een controller voert de eigenlijke businesslogica van een specifieke route uit. Middleware is een doorsnijdende laag die algemene filtering of controles op het verzoek toepast en die over veel routes terugkeert. Werk zoals authenticatie hoort in de middleware, niet in de controller.

Kan ik meerdere middlewares aan één route toevoegen?

Ja. Je geeft een array door zoals ->middleware(['auth', 'token', 'role:editor']); ze worden aan de keten toegevoegd in de volgorde waarin je ze schrijft.

Kan ik globale middleware uitsluiten voor bepaalde routes?

Meestal is de schonere oplossing om de middleware via een alias aan de betreffende groep of routes toe te voegen in plaats van hem globaal te maken. Zo bepaal je precies waar hij draait.

Wil je de middleware-architectuur in je Laravel-project goed opzetten? Van authenticatie tot meertalige detectie help ik je een schone, testbare middleware-laag te ontwerpen. Neem contact met me op.

Devamı için