artikels

Laravel middleware hoe't it wurket

Laravel middleware is in tuskenlizzende applikaasjelaach dy't yngrypt tusken it fersyk fan 'e brûker en it antwurd fan 'e applikaasje.

Dit betsjut dat as de brûker (Laravel werjefte) in fersyk oan 'e tsjinner (Laravel controller), it fersyk sil gean troch de middleware. Op dizze manier kin de middleware kontrolearje oft it fersyk authentisearre is of net: 

  • as it fersyk fan de brûker is authentisearre, wurdt it fersyk nei de efterkant stjoerd;
  • as it fersyk fan de brûker net authentisearre is, sil de middleware de brûker trochferwize nei it oanmeldskerm.

Laravel kinne jo defifinish en brûk ekstra middleware om in ferskaat oan taken út te fieren útsein autentikaasje. 

Laravel middlewares, lykas autentikaasje en CSRF-beskerming, lizze yn 'e map app/Http/Middleware .

Wy kinne dêrom sizze dat de middleware in http-oanfraachfilter is, wêrtroch it mooglik is om betingsten te ferifiearjen en aksjes út te fieren.

It meitsjen fan middleware

Om in nije middleware te meitsjen rinne wy ​​it folgjende kommando út:

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

Wy meitsje de middleware en wy neame it CheckAge, artisan sil ús as folgjend antwurdzje:

It finster hjirboppe lit sjen dat de middleware mei súkses makke is mei de namme " CheckAge ".

Om te sjen oft de CheckAge-middleware is oanmakke of net, gean nei it projekt yn 'e app/Http/Middleware-map, en jo sille it nij oanmakke bestân sjen

De nij oanmakke triem hat de folgjende koade

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

Brûk middleware

Om middleware te brûken, moatte wy it registrearje.

D'r binne twa soarten middleware yn Laravel:

  • Middleware globale
  • Route Middleware

Il globale middleware sil útfierd wurde op elke HTTP-fersyk fan 'e applikaasje, wylst de Rûte Middleware sil wurde tawiisd oan in spesifyk paad. Middleware kin registrearre wurde by app/Http/Kernel.php. Dizze triem befettet twa eigenskippen $middleware e $routeMiddleware . De $middleware-eigendom wurdt brûkt om wrâldwide middleware en eigendom te registrearjen $routeMiddleware wurdt brûkt om rûte-spesifike middleware te registrearjen.

Om wrâldwide middleware te registrearjen, listje de klasse oan 'e ein fan it $middleware-eigenskip.

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 rûtespesifike middleware te registrearjen, foegje de kaai en wearde ta oan it $routeMiddleware-eigenskip.

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

Wy makken CheckAge yn it foarige foarbyld. Wy kinne dit no registrearje yn it eigendom fan 'e middleware-rûte. De koade foar sa'n registraasje wurdt hjirûnder werjûn.

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

Wy kinne ek parameters trochjaan mei Middleware. 

Bygelyks, as jo applikaasje ferskate rollen hat lykas brûker, admin, super admin ensfh. en jo wolle de aksje authentisearje op basis fan 'e rol, kinne jo it dwaan troch de parameters mei de middleware troch te jaan. 

De middleware dy't wy makke hawwe befettet de folgjende funksje, en wy kinne oanpaste arguminten trochjaan nei it argumint $ folgjende .

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

Litte wy no besykje de rolparameter yn te stellen op in nije middleware dy't wy fanôf it begjin sille meitsje, gean dan troch mei it meitsjen fan Role Middleware troch it folgjende kommando út te fieren

Feroarje de handgreepmetoade as folget

<?php

namespace App\Http\Middleware;
use Closure;

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

wy tafoege de parameter $role, en binnen de metoade de line echo om de útfier de namme fan 'e rol te skriuwen.

Ynnovaasje nijsbrief
Mis it wichtichste nijs oer ynnovaasje net. Meld jo oan om se fia e-post te ûntfangen.

Litte wy no de RoleMiddleware-middleware registrearje foar in spesifyk paad

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

No om de middleware te testen mei de parameter, moatte wy in fersyk en in antwurd meitsje. Om it antwurd te simulearjen, litte wy de controller oanmeitsje dy't wy TestController sille neame

php artisan make:controller TestController --plain

it krekt útfierde kommando sil in nije controller meitsje yn 'e map app/Http/TestController.php, en feroarje de metoade index mei de line 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.";
   }
}

Nei it ynstellen fan it antwurd bouwe wy it fersyk op troch it bestân te bewurkjen routes.phptroch it tafoegjen fan de route role

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

op dit punt kinne wy ​​​​it foarbyld besykje troch de URL te besykjen http://localhost:8000/role

en yn 'e browser sille wy de twa sjen echo

Role editor
Test Controller

Terminable Middleware

Il terminable Middleware fiert guon taken neidat it antwurd is stjoerd nei de browser. Dit kin berikt wurde troch it meitsjen fan in middleware mei de metoade beëinigje yn 'e middleware. Il terminable Middleware moatte wurde registrearre mei de middleware mondiaal. De metoade terminate sil ûntfange twa arguminten $oanfraach e $ antwurd. 

De metoade Terminate moat oanmakke wurde lykas werjûn yn 'e folgjende koade.

php artisan make:middleware TerminateMiddleware

Sadree't de middleware is oanmakke app/Http/Middleware/TerminateMiddleware.php lit ús wizigje de koade as folget

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

yn dit gefal hawwe wy in metoade handle en metoade terminate mei de twa parameters $request e $response.

Litte wy no de Middleware registrearje

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

No moatte wy de controller oanmeitsje om it antwurd te simulearjen

php artisan make:controller XYZController --plain

it feroarjen fan de ynhâld fan 'e klasse

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

No moatte wy de triem bewurkje routes/web.php it tafoegjen fan de rûtes dy't nedich binne om it fersyk te aktivearjen

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

op dit punt kinne wy ​​​​it foarbyld besykje troch de URL te besykjen http://localhost:8000/terminate

en yn 'e browser sille wy de folgjende rigels sjen

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

Ercole Palmeri

Jo meie ek leuk fine:

Ynnovaasje nijsbrief
Mis it wichtichste nijs oer ynnovaasje net. Meld jo oan om se fia e-post te ûntfangen.

Recent articles

De takomst is hjir: hoe't de skipfeartsektor de wrâldekonomy revolúsjonearret

De marinesektor is in wiere wrâldwide ekonomyske macht, dy't navigearre is nei in merk fan 150 miljard ...

1 mei 2024

Utjouwers en OpenAI tekenje oerienkomsten om de stream fan ynformaasje te regeljen ferwurke troch Artificial Intelligence

Ofrûne moandei kundige de Financial Times in deal oan mei OpenAI. FT lisinsje har sjoernalistyk fan wrâldklasse ...

30 april 2024

Online betellingen: Hjir is hoe streamingtsjinsten jo foar altyd betelje

Miljoenen minsken betelje foar streamingtsjinsten, beteljen moanlikse abonnemintskosten. It is gewoane miening dat jo ...

29 april 2024

Veeam hat de meast wiidweidige stipe foar ransomware, fan beskerming oant antwurd en herstel

Coveware troch Veeam sil trochgean mei it leverjen fan antwurdtsjinsten foar cyberafpersing ynsidint. Coveware sil forensyske en sanearjen mooglikheden oanbiede ...

23 april 2024