Artikelen

Laravel-middleware hoe het werkt

Laravel-middleware is een tussenliggende applicatielaag die intervenieert tussen het verzoek van de gebruiker en het antwoord van de applicatie.

Dit betekent dat wanneer de gebruiker (Laravel-weergave) een verzoek doet aan de server (Laravel-controller), het verzoek via de middleware gaat. Op deze manier kan de middleware controleren of het verzoek is geverifieerd of niet: 

  • als het verzoek van de gebruiker is geverifieerd, wordt het verzoek naar de backend gestuurd;
  • als het verzoek van de gebruiker niet geverifieerd is, zal de middleware de gebruiker omleiden naar het inlogscherm.

Laravel staat je dat toe defivoltooi en gebruik aanvullende middleware om een ​​verscheidenheid aan taken uit te voeren, behalve authenticatie. 

Laravel-middlewares, zoals authenticatie en CSRF-beveiliging, bevinden zich in de directory app/Http/Middleware .

We kunnen dus zeggen dat de middleware een http-verzoekfilter is, waarmee het mogelijk is om voorwaarden te verifiëren en acties uit te voeren.

Middelware maken

Om een ​​nieuwe middleware te maken voeren we de volgende opdracht uit:

php artisan make:middleware <name-of-middleware>

Wij creëren de middleware en we noemen het CheckAge, artisan zal ons als volgt antwoorden:

Het bovenstaande venster laat zien dat de middleware succesvol is aangemaakt met de naam ” CheckLeeftijd '.

Om te zien of de CheckAge-middleware is gemaakt of niet, gaat u naar het project in de map app/Http/Middleware en ziet u het nieuw gemaakte bestand

Het nieuw gemaakte bestand heeft de volgende code

<?php

namespace App\Http\Middleware;

use Closure;

class CheckAge
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

Gebruik middleware

Om middleware te gebruiken, moeten we deze registreren.

Er zijn twee soorten middleware in Laravel:

  • Middleware globale
  • Route Middleware

Il wereldwijde middleware wordt uitgevoerd op elk HTTP-verzoek van de applicatie, terwijl de Route-middleware wordt toegewezen aan een specifiek pad. Middleware kan worden geregistreerd bij app/Http/Kernel.php. Dit bestand bevat twee eigenschappen $middleware e $routeMiddleware . De eigenschap $middleware wordt gebruikt om wereldwijde middleware en eigendom te registreren $routeMiddleware wordt gebruikt om routespecifieke middleware te registreren.

Om globale middleware te registreren, vermeldt u de klasse aan het einde van de eigenschap $middleware.

protected $middleware = [
        \App\Http\Middleware\TrustProxies::class,
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

Om routespecifieke middleware te registreren, voegt u de sleutel en waarde toe aan de eigenschap $routeMiddleware.

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    ];

We hebben gemaakt CheckLeeftijd in het vorige voorbeeld. We kunnen dit nu registreren in de eigenschap middlewareroute. De code voor een dergelijke registratie wordt hieronder weergegeven.

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'Age' => \App\Http\Middleware\CheckAge::class,
    ];

Middleware-parameters

We kunnen ook parameters doorgeven met Middleware. 

Als uw toepassing bijvoorbeeld verschillende rollen heeft, zoals gebruiker, beheerder, superbeheerder enz. en u de actie wilt verifiëren op basis van de rol, kunt u dit doen door de parameters door te geven met de middleware. 

De middleware die we hebben gemaakt, bevat de volgende functie en we kunnen aangepaste argumenten doorgeven na het argument $volgende .

    public function handle($request, Closure $next)
    {
        return $next($request);
    }

Laten we nu proberen de role-parameter in te stellen op een nieuwe middleware die we helemaal opnieuw gaan maken, en vervolgens doorgaan met het maken van Role-middleware door de volgende opdracht uit te voeren

Wijzig de handle-methode als volgt

<?php

namespace App\Http\Middleware;
use Closure;

class RoleMiddleware {
   public function handle($request, Closure $next, $role) {
      echo "Role: ".$role;
      return $next($request);
   }
}

we hebben de parameter toegevoegd $role, en binnen de methode de regel echo om de uitvoer de naam van de rol te schrijven.

Innovatie nieuwsbrief
Mis het belangrijkste nieuws over innovatie niet. Meld u aan om ze per e-mail te ontvangen.

Laten we nu de RoleMiddleware-middleware registreren voor een specifiek pad

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'Age' => \App\Http\Middleware\CheckAge::class,
        'Role' => \App\Http\Middleware\RoleMiddleware::class,
    ];

Om nu de middleware met de parameter te testen, moeten we een verzoek en een antwoord maken. Om het antwoord te simuleren, maken we de controller die we TestController zullen noemen

php artisan make:controller TestController --plain

de zojuist uitgevoerde opdracht maakt een nieuwe controller in de map app/Http/TestController.phpen verander de methode index met de lijn echo "<br>Test Controller.";

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class TestController extends Controller {
   public function index() {
      echo "<br>Test Controller.";
   }
}

Nadat we het antwoord hebben ingesteld, bouwen we het verzoek op door het bestand te bewerken routes.phpdoor toevoeging van de route role

Route::get('role',[
   'middleware' => 'Role:editor',
   'uses' => 'TestController@index',
]);

op dit punt kunnen we het voorbeeld proberen door de URL te bezoeken http://localhost:8000/role

en in de browser zullen we de twee zien echo

Role editor
Test Controller

Beëindigbare middleware

Il terminable Middleware voert enkele taken uit nadat het antwoord naar de browser is verzonden. Dit kan worden bereikt door middel van het creëren van een middleware met de methode eindigen in de middleware. Il terminable Middleware moet aangemeld zijn bij de middleware globaal. De methode terminate krijgt twee argumenten $ verzoek e $antwoord. 

De methode Terminate moet worden gemaakt zoals weergegeven in de volgende code.

php artisan make:middleware TerminateMiddleware

Zodra de middleware is gemaakt app/Http/Middleware/TerminateMiddleware.php laten we de code als volgt wijzigen

<?php

namespace App\Http\Middleware;
use Closure;

class TerminateMiddleware {
   public function handle($request, Closure $next) {
      echo "Executing statements of handle method of TerminateMiddleware.";
      return $next($request);
   }
   
   public function terminate($request, $response) {
      echo "<br>Executing statements of terminate method of TerminateMiddleware.";
   }
}

in dit geval hebben we een methode handle en een methode terminate met de twee parameters $request e $response.

Laten we nu de middleware registreren

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'Age' => \App\Http\Middleware\CheckAge::class,
        'Role' => \App\Http\Middleware\RoleMiddleware::class,
        'terminate' => \App\Http\Middleware\TerminateMiddleware::class,
    ];

Nu moeten we de controller maken om de reactie te simuleren

php artisan make:controller XYZController --plain

de inhoud van de klas wijzigen

class XYZController extends Controller {
   public function index() {
      echo "<br>XYZ Controller.";
   }
}

Nu moeten we het bestand bewerken routes/web.php het toevoegen van de routes die nodig zijn om het verzoek te activeren

Route::get('terminate',[
   'middleware' => 'terminate',
   'uses' => 'XYZController@index',
]);

op dit punt kunnen we het voorbeeld proberen door de URL te bezoeken http://localhost:8000/terminate

en in de browser zullen we de volgende regels zien

Executing statements of handle method of TerminateMiddleware
XYZController
Executing statements of terminate method of TerminateMiddleware

Ercole Palmeri

Mogelijk bent u ook geïnteresseerd in:

Innovatie nieuwsbrief
Mis het belangrijkste nieuws over innovatie niet. Meld u aan om ze per e-mail te ontvangen.

Recente artikelen

De toekomst is hier: hoe de scheepvaartindustrie een revolutie teweegbrengt in de wereldeconomie

De marinesector is een echte mondiale economische macht, die is genavigeerd naar een markt van 150 miljard...

1 mei 2024

Uitgevers en OpenAI ondertekenen overeenkomsten om de informatiestroom die door kunstmatige intelligentie wordt verwerkt, te reguleren

Afgelopen maandag maakte de Financial Times een deal met OpenAI bekend. FT geeft licenties voor haar journalistiek van wereldklasse...

April 30 2024

Online betalingen: hier is hoe streamingdiensten u voor altijd laten betalen

Miljoenen mensen betalen voor streamingdiensten en betalen maandelijkse abonnementskosten. De algemene mening is dat je…

April 29 2024

Veeam biedt de meest uitgebreide ondersteuning voor ransomware, van bescherming tot respons en herstel

Coveware by Veeam zal responsdiensten op het gebied van cyberafpersingsincidenten blijven leveren. Coveware zal forensische en herstelmogelijkheden bieden...

April 23 2024