Articole

Laravel middleware cum funcționează

Middleware-ul Laravel este un strat de aplicație intermediar care intervine între solicitarea utilizatorului și răspunsul aplicației.

Aceasta înseamnă că atunci când utilizatorul (vizualizarea Laravel) face o cerere către server (controlerul Laravel), cererea va trece prin middleware. În acest fel, middleware-ul poate verifica dacă cererea este autentificată sau nu: 

  • dacă cererea utilizatorului este autentificată, cererea este trimisă la backend;
  • dacă cererea utilizatorului este neautentificată, middleware-ul va redirecționa utilizatorul către ecranul de conectare.

Laravel îți permite defifinalizați și utilizați middleware suplimentar pentru a efectua o varietate de sarcini, cu excepția autentificării. 

Middleware-urile Laravel, cum ar fi autentificarea și protecția CSRF, sunt localizate în director aplicație/Http/Middleware .

Prin urmare, putem spune că middleware-ul este un filtru de solicitare http, prin care este posibil să se verifice condițiile și să se efectueze acțiuni.

Crearea middleware

Pentru a crea un nou middleware, rulăm următoarea comandă:

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

Noi creăm middleware și o numim CheckAge, artisan ne va raspunde in felul urmator:

Fereastra de mai sus arată că middleware-ul a fost creat cu succes cu numele ” CheckAge ".

Pentru a vedea dacă middleware-ul CheckAge este sau nu creat, accesați proiectul în folderul aplicație/Http/Middleware și veți vedea fișierul nou creat

Fișierul nou creat are următorul cod

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

Utilizați middleware

Pentru a folosi middleware, trebuie să îl înregistrăm.

Există două tipuri de middleware în Laravel:

  • Middleware globale
  • Route Middleware

Il middleware global va fi executat la fiecare solicitare HTTP din aplicație, în timp ce Route Middleware va fi atribuit unei anumite căi. Middleware-ul poate fi înregistrat la app/Http/Kernel.php. Acest fișier conține două proprietăți $middleware e $routeMiddleware . Proprietatea $middleware este folosit pentru a înregistra middleware global și proprietate $routeMiddleware este folosit pentru a înregistra middleware specific rutei.

Pentru a înregistra middleware global, listați clasa la sfârșitul proprietății $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,
    ];

Pentru a înregistra middleware specific rutei, adăugați cheia și valoarea proprietății $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,
    ];

Noi am creat CheckAge în exemplul anterior. Acum putem înregistra acest lucru în proprietatea rutei middleware. Codul pentru o astfel de înregistrare este prezentat mai jos.

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

Parametrii middleware

Putem trece parametri și cu Middleware. 

De exemplu, dacă aplicația dvs. are roluri diferite, cum ar fi utilizator, administrator, super admin etc. și doriți să autentificați acțiunea în funcție de rol, o puteți face trecând parametrii cu middleware-ul. 

Middleware-ul pe care l-am creat conține următoarea funcție și putem trece argumente personalizate după argument $în continuare .

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

Acum să încercăm să setăm parametrul rol la un nou middleware pe care îl vom crea de la zero, apoi să continuăm să creăm Role Middleware rulând următoarea comandă

Modificați metoda mânerului după cum urmează

<?php

namespace App\Http\Middleware;
use Closure;

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

am adaugat parametrul $role, iar în interiorul metodei linia echo pentru a scrie ieșirea numele rolului.

Buletin informativ de inovare
Nu rata cele mai importante știri despre inovație. Înscrieți-vă pentru a le primi pe e-mail.

Acum să înregistrăm middleware-ul RoleMiddleware pentru o anumită cale

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

Acum, pentru a testa middleware-ul cu parametrul, trebuie să creăm o cerere și un răspuns. Pentru a simula răspunsul, să creăm controlerul pe care îl vom numi TestController

php artisan make:controller TestController --plain

comanda tocmai executată va crea un nou controler în interiorul folderului app/Http/TestController.phpși schimbați metoda index cu linia 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.";
   }
}

După configurarea răspunsului, construim cererea prin editarea fișierului routes.phpprin adăugarea route role

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

în acest moment putem încerca exemplul vizitând adresa URL http://localhost:8000/role

iar în browser le vom vedea pe cele două echo

Role editor
Test Controller

Middleware terminabil

Il terminable Middleware efectuează unele sarcini după ce răspunsul este trimis către browser. Acest lucru poate fi realizat prin crearea unui middleware cu metoda termina în middleware. Il terminable Middleware trebuie să fie înregistrat la middleware global. Metoda terminate va primi două argumente $ cerere e $răspuns. 

Metoda Terminate trebuie creat așa cum se arată în codul următor.

php artisan make:middleware TerminateMiddleware

Odată ce middleware-ul este creat app/Http/Middleware/TerminateMiddleware.php să modificăm codul după cum urmează

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

în acest caz avem o metodă handle si o metoda terminate cu cei doi parametri $request e $response.

Acum să înregistrăm Middleware-ul

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

Acum trebuie să creăm controlerul pentru a simula răspunsul

php artisan make:controller XYZController --plain

modificarea conținutului clasei

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

Acum trebuie să edităm fișierul routes/web.php adăugarea rutelor necesare pentru a activa cererea

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

în acest moment putem încerca exemplul vizitând adresa URL http://localhost:8000/terminate

iar în browser vom vedea următoarele rânduri

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

Ercole Palmeri

Ați putea, de asemenea, să vă placă:

Buletin informativ de inovare
Nu rata cele mai importante știri despre inovație. Înscrieți-vă pentru a le primi pe e-mail.

Articole recente

Veeam oferă cel mai complet suport pentru ransomware, de la protecție la răspuns și recuperare

Coveware de la Veeam va continua să ofere servicii de răspuns la incidente de extorcare cibernetică. Coveware va oferi capacități criminalistice și de remediere...

Aprilie 23 2024

Revoluția verde și digitală: cum întreținerea predictivă transformă industria petrolului și gazelor

Întreținerea predictivă revoluționează sectorul petrolului și gazelor, cu o abordare inovatoare și proactivă a managementului uzinelor...

Aprilie 22 2024

Autoritatea de reglementare antitrust din Marea Britanie ridică alarma BigTech cu privire la GenAI

CMA din Marea Britanie a emis un avertisment cu privire la comportamentul Big Tech pe piața inteligenței artificiale. Acolo…

Aprilie 18 2024

Casa Green: revoluție energetică pentru un viitor durabil în Italia

Decretul „Case verzi”, formulat de Uniunea Europeană pentru creșterea eficienței energetice a clădirilor, și-a încheiat procesul legislativ cu...

Aprilie 18 2024