Artiklar

Laravel middleware hur det fungerar

Laravel-mellanvara är ett mellanliggande applikationsskikt som intervenerar mellan användarens begäran och applikationens svar.

Detta innebär att när användaren (Laravel-vyn) gör en förfrågan till servern (Laravel-kontrollern), kommer begäran att gå genom mellanvaran. På så sätt kan mellanvaran kontrollera om begäran är autentiserad eller inte: 

  • om användarens begäran är autentiserad, skickas begäran till backend;
  • om användarens begäran är oautentiserad kommer mellanvaran att omdirigera användaren till inloggningsskärmen.

Laravel låter dig defiavsluta och använda ytterligare mellanprogram för att utföra en mängd olika uppgifter förutom autentisering. 

Laravel-mellanprogram, såsom autentisering och CSRF-skydd, finns i katalogen app/Http/Middleware .

Vi kan därför säga att mellanvaran är ett http-begäranfilter, genom vilket det är möjligt att verifiera villkor och utföra åtgärder.

Skapar mellanprogram

För att skapa en ny mellanprogram kör vi följande kommando:

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

Vi skapar middleware och vi kallar det CheckAge, artisan kommer att svara oss enligt följande:

Fönstret ovan visar att mellanvaran har skapats framgångsrikt med namnet ” CheckAge ".

För att se om CheckAge-mellanvaran är skapad eller inte, gå till projektet i mappen app/Http/Middleware så ser du den nyskapade filen

Den nyskapade filen har följande kod

<?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);
    }
}

Använd middleware

För att använda middleware måste vi registrera den.

Det finns två typer av mellanprogram i Laravel:

  • Middleware globale
  • Route Middleware

Il global mellanvara kommer att köras på varje HTTP-begäran från applikationen, medan Route Middleware kommer att tilldelas en specifik väg. Mellanvara kan registreras på app/Http/Kernel.php. Den här filen innehåller två egenskaper $mellanvara e $routeMiddleware . Egenskapen $middleware används för att registrera global mellanvara och ägande $routeMiddleware används för att registrera ruttspecifik middleware.

För att registrera global middleware, lista klassen i slutet av $middleware-egenskapen.

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,
    ];

För att registrera ruttspecifik middleware, lägg till nyckeln och värdet i egenskapen $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,
    ];

Vi skapade CheckAge i föregående exempel. Vi kan nu registrera detta i middleware route-egenskapen. Koden för en sådan registrering visas nedan.

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,
    ];

Mellanvaruparametrar

Vi kan även skicka parametrar med Middleware. 

Till exempel, om din applikation har olika roller som användare, admin, superadmin etc. och du vill autentisera åtgärden baserat på rollen kan du göra det genom att skicka parametrarna med mellanvaran. 

Mellanvaran vi skapade innehåller följande funktion, och vi kan skicka anpassade argument efter argumentet $nästa .

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

Låt oss nu försöka ställa in rollparametern till en ny mellanprogram som vi ska skapa från början, fortsätt sedan med att skapa Rollmellanvara genom att köra följande kommando

Ändra hanteringsmetoden enligt följande

<?php

namespace App\Http\Middleware;
use Closure;

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

vi lade till parametern $role, och inuti metoden linjen echo för att skriva utgången namnet på rollen.

Nyhetsbrev för innovation
Missa inte de viktigaste nyheterna om innovation. Registrera dig för att få dem via e-post.

Låt oss nu registrera RoleMiddleware-mellanvaran för en specifik sökväg

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,
    ];

För att nu testa mellanvaran med parametern måste vi skapa en begäran och ett svar. För att simulera svaret låt oss skapa styrenheten som vi kommer att kalla TestController

php artisan make:controller TestController --plain

kommandot som just körs skapar en ny styrenhet i mappen app/Http/TestController.phpoch ändra metoden index med linan 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.";
   }
}

Efter att ha ställt in svaret bygger vi begäran genom att redigera filen routes.phpgenom att lägga till route role

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

vid det här laget kan vi prova exemplet genom att besöka URL:en http://localhost:8000/role

och i webbläsaren kommer vi att se de två echo

Role editor
Test Controller

Avslutbar mellanvara

Il terminable Middleware utför vissa uppgifter efter att svaret har skickats till webbläsaren. Detta kan uppnås genom att skapa en middleware med metoden avslutas i mellanvaran. Il terminable Middleware måste registreras hos middleware global. Metoden terminate kommer att få två argument $ begäran e $svar. 

Metoden Terminate måste skapas som visas i följande kod.

php artisan make:middleware TerminateMiddleware

När mellanvaran har skapats app/Http/Middleware/TerminateMiddleware.php låt oss ändra koden enligt följande

<?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.";
   }
}

i det här fallet har vi en metod handle och en metod terminate med de två parametrarna $request e $response.

Låt oss nu registrera mellanvaran

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 måste vi skapa kontrollern för att simulera svaret

php artisan make:controller XYZController --plain

ändra innehållet i klassen

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

Nu måste vi redigera filen routes/web.php lägga till de rutter som behövs för att aktivera begäran

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

vid det här laget kan vi prova exemplet genom att besöka URL:en http://localhost:8000/terminate

och i webbläsaren ser vi följande rader

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

Ercole Palmeri

Du kanske också gillar:

Nyhetsbrev för innovation
Missa inte de viktigaste nyheterna om innovation. Registrera dig för att få dem via e-post.

Articoli recenti

Fördelarna med målarbok för barn - en värld av magi för alla åldrar

Att utveckla finmotorik genom färgläggning förbereder barn för mer komplexa färdigheter som att skriva. Att färglägga…

2 maj 2024

Framtiden är här: Hur sjöfartsindustrin revolutionerar den globala ekonomin

Marinesektorn är en sann global ekonomisk makt, som har navigerat mot en marknad på 150 miljarder...

1 maj 2024

Publishers och OpenAI tecknar avtal för att reglera flödet av information som bearbetas av artificiell intelligens

I måndags tillkännagav Financial Times ett avtal med OpenAI. FT licensierar sin journalistik i världsklass...

30 April 2024

Onlinebetalningar: Här är hur streamingtjänster får dig att betala för alltid

Miljontals människor betalar för streamingtjänster och betalar månatliga prenumerationsavgifter. Det är en allmän uppfattning att du...

29 April 2024