Despre middleware-uri in laravel

postat acum 3 ani de Stefanescu Mihai in categorie iNoob

HTTP Middleware este un mecanism ce ne ajuta la filtrarea cererilor HTTP de a ajunge in aplicatia ta. In Laravel, de exemplu avem un middleware ce ne ajuta sa verificam daca un utlizator este autentificat.

La ce putem folosi Middleware

Iata unde va poate fi de folos un middleware. 

  • Daca lucrati la un api puteti face un middleware pentru a confirma  API key-ul
  • Putem schimba limba site-ului in functie de zona in care ne aflam
  • Putem porni modul de maintanance

La sfarsitul acestui articol ve-ti avea idee cum puteti crea un middleware si cum il puteti folosi in proiectul vostru. Pentru a va ajuta sa inetlegeti un middleware am sa fac impreuna cu voi un middleware ce va afisa un mesaj de mentenanta pe tot site-ul sau numai pe anumite rute.

Crearea unui middleware

Cu ajutorul artisan putem face un middlware foarte simplu, tot ce trebuie sa facem este sa deschidem un terminal si sa scriuem urmatoarea comanda:

php artisan make:middleware [nume middleware]

Aceasta comanda va crea un fisier nou in app/Http/Middleware.

Iata comanda executata de mine:

php artisan make:middleware DownForMaintenance

Acum putem deschide fisierul middleware si putem adauga codul. Primul lucru pe care trebuie sa-l facem este sa importam HttpException astfel:

use Symfony\Component\HttpKernel\Exception\HttpException;

In metoda handle a middleware-ului putem adauga acest cod:

public function handle($request, Closure $next){ 
    throw new HttpException(503);
}

Aruncand aceasta exceptie laravel va afisa view-ul 503.blade.php care ar trebuii sa le afiseze un mesaj cum ca site-ul este in mentenanta.

Inregistrarea unui Middleware

Acum ca am creat un middleware trebuie sa anuntam si apicatia despre existenta acestuia. Daca doriti ca acest middleware sa poata fi folosit  la fiecare request intrati in app/Http/kernel.php si adaugati  urmatorul cod in array-ul $middleware:

'down.for.maintenance' => \App\Http\Middleware\DownForMaintenance::class,

Atasarea unu middleware unei rute

Stim deja cum arata o ruta:

Route::get('posts/{parametru}', '[email protected]');

Metoda getPost din controller-ul PostController este rulata atunci cand este accesat link-ul posts/{parametru}

Putem adauga acest middleware rutei schimband ce-l de-al doilea parametru din string in array astfel:

Route::get('posts/{parametru}', ['middleware' => 'grown.ups.only', function () { return "NU! Nu vreau sa vezi aceasat pagina!";}]);

Acum daca cineva acceseaza ruta posts/{parametru} nu va mai ajunge in controller, ci va putea sa vada numai o pagina cu un mesaj.

Parametri in middleware

Pasarea de parametri unui middleware este destul de simpla. De exemplu, poate dorim sa verificam ce rol are utilizatorul care a accesat aceasta ruta, putem pasa atat un rol cat si o lista cu toate rolurile.

Pentru a pasa un parametru unui middleware,dupa $request si Closure adauga variabila ce dorim sa fie preluata ca parametru:

public function handle($request, Closure $next, $role){ 
    if (! $request->user()->hasRole($role)) { 
              // Redirect... 
    } 
    return $next($request);
}

Pentru a pasa o variabila cand atasam un middleware unei rute facem astfel:

Route::put('post/{id}', ['middleware' => 'role:editor', function ($id) { //}]);

Concluzie

In acest articol am vorbit numai despre un mod in care poate fi folosit un middleware, de fapt le puteti folosi intr-o multume de moduri.

Pentru orice nelamurire puteti lasa un comentariu mai jos sau puteti posta pe forum aici: http://www.invata-programare.ro/forums/topic/despre_middleware_in_framework-ul_laravel

Sunt un tanar programator din Bucuresti ce lucreaza in PHP/Mysql (MySqli/PDO), Laravel, CodeIgniter, MySQL, PostgreSQL, Wordpress, HTML5/CSS3, Sass, Photoshop si multe altele.
Google+ Community Facebook Group