tovar

Laravel middleware, ako to funguje

Laravel middleware je prostredná aplikačná vrstva, ktorá zasahuje medzi požiadavku používateľa a odpoveď aplikácie.

To znamená, že keď používateľ (pohľad Laravel) zadá požiadavku na server (radič Laravel), požiadavka prejde cez middleware. Týmto spôsobom môže middleware skontrolovať, či je požiadavka overená alebo nie: 

  • ak je požiadavka používateľa overená, požiadavka sa odošle na backend;
  • ak je požiadavka používateľa neoverená, middleware presmeruje používateľa na prihlasovaciu obrazovku.

Laravel vám to umožňuje defidokončiť a použiť ďalší middleware na vykonávanie rôznych úloh okrem autentifikácie. 

Middleware Laravel, ako je autentifikácia a ochrana CSRF, sa nachádzajú v adresári app/Http/Middleware .

Dá sa teda povedať, že middleware je http filter požiadaviek, cez ktorý je možné overovať podmienky a vykonávať akcie.

Vytváranie middlewaru

Na vytvorenie nového middlewaru spustíme nasledujúci príkaz:

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

Vytvárame middleware a voláme to CheckAge, artisan nám odpovie takto:

Vyššie uvedené okno ukazuje, že middleware bol úspešne vytvorený s názvom “ CheckAge ".

Ak chcete zistiť, či je middleware CheckAge vytvorený alebo nie, prejdite do projektu v priečinku app/Http/Middleware a uvidíte novovytvorený súbor

Novovytvorený súbor má nasledujúci kód

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

Použite middleware

Aby sme mohli používať middleware, musíme ho zaregistrovať.

V Laravel existujú dva typy middlewaru:

  • Middleware globale
  • Route Middleware

Il globálny middleware sa vykoná pri každej požiadavke HTTP z aplikácie, pričom Middleware trasy budú priradené ku konkrétnej ceste. Middleware je možné zaregistrovať na app/Http/Kernel.php. Tento súbor obsahuje dve vlastnosti $middleware e $routeMiddleware . Vlastnosť $middleware sa používa na registráciu globálneho midlvéru a vlastníctva $routeMiddleware sa používa na registráciu middleware špecifického pre trasu.

Ak chcete zaregistrovať globálny middleware, uveďte triedu na konci vlastnosti $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,
    ];

Ak chcete zaregistrovať middleware špecifický pre trasu, pridajte kľúč a hodnotu do vlastnosti $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,
    ];

Vytvorili sme CheckAge v predchádzajúcom príklade. Teraz to môžeme zaregistrovať vo vlastnosti middleware route. Kód takejto registrácie je uvedený nižšie.

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

Parametre middlewaru

Parametre môžeme odovzdať aj pomocou Middleware. 

Napríklad, ak má vaša aplikácia rôzne roly, ako je používateľ, správca, supersprávca atď. a chcete overiť akciu na základe roly, môžete to urobiť odovzdaním parametrov middlevéru. 

Middleware, ktorý sme vytvorili, obsahuje nasledujúcu funkciu a za argumentom môžeme odovzdať vlastné argumenty $ďalší .

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

Teraz skúsme nastaviť parameter role na nový middleware, ktorý sa chystáme vytvoriť od začiatku, a potom pokračujte v vytváraní rolového Middleware spustením nasledujúceho príkazu

Upravte metódu rukoväte nasledovne

<?php

namespace App\Http\Middleware;
use Closure;

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

pridali sme parameter $rolea vo vnútri metódy riadok echo napísať výstup názov roly.

Inovačný bulletin
Nenechajte si ujsť najdôležitejšie novinky o inováciách. Prihláste sa na ich odber e-mailom.

Teraz poďme zaregistrovať middleware RoleMiddleware pre konkrétnu cestu

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

Teraz, aby sme otestovali middleware s parametrom, musíme vytvoriť požiadavku a odpoveď. Aby sme simulovali odozvu, vytvorme ovládač, ktorý budeme nazývať TestController

php artisan make:controller TestController --plain

práve vykonaný príkaz vytvorí v priečinku nový ovládač app/Http/TestController.phpa zmeňte metódu index s linkou 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.";
   }
}

Po nastavení odpovede zostavíme požiadavku úpravou súboru routes.phppridaním route role

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

v tomto bode môžeme vyskúšať príklad návštevou adresy URL http://localhost:8000/role

a v prehliadači uvidíme dve echo

Role editor
Test Controller

Terminovateľný middleware

Il terminable Middleware vykonáva niektoré úlohy po odoslaní odpovede do prehliadača. To sa dá dosiahnuť vytvorením middlewaru s touto metódou ukončiť v middleware. Il terminable Middleware musí byť zaregistrovaný u middleware globálne. Metóda terminate dostane dva argumenty $žiadosť e $response. 

Metóda Terminate musí byť vytvorený tak, ako je uvedené v nasledujúcom kóde.

php artisan make:middleware TerminateMiddleware

Akonáhle je vytvorený middleware app/Http/Middleware/TerminateMiddleware.php upravme kód nasledovne

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

v tomto prípade máme metódu handle a spôsob terminate s dvoma parametrami $request e $response.

Teraz poďme zaregistrovať Middleware

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

Teraz musíme vytvoriť ovládač na simuláciu odozvy

php artisan make:controller XYZController --plain

úprava obsahu triedy

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

Teraz musíme súbor upraviť routes/web.php pridanie trás potrebných na aktiváciu požiadavky

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

v tomto bode môžeme vyskúšať príklad návštevou adresy URL http://localhost:8000/terminate

a v prehliadači uvidíme nasledujúce riadky

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

Ercole Palmeri

Môže sa vám tiež páčiť:

Inovačný bulletin
Nenechajte si ujsť najdôležitejšie novinky o inováciách. Prihláste sa na ich odber e-mailom.

Nedávne články

Výhody farebných stránok pre deti - svet mágie pre všetky vekové kategórie

Rozvíjanie jemnej motoriky pomocou vyfarbovania pripravuje deti na zložitejšie zručnosti, ako je písanie. Na farbenie…

2 mája 2024

Budúcnosť je tu: Ako námorný priemysel prináša revolúciu do globálnej ekonomiky

Námorný sektor je skutočnou globálnou ekonomickou veľmocou, ktorá smerovala k 150 miliardovému trhu...

1 mája 2024

Vydavatelia a OpenAI podpisujú dohody o regulácii toku informácií spracovávaných umelou inteligenciou

Minulý pondelok Financial Times oznámili dohodu s OpenAI. FT licencuje svoju žurnalistiku svetovej triedy…

Apríla 30 2024

Online platby: Takto budete vďaka streamovacím službám platiť navždy

Milióny ľudí platia za streamovacie služby a platia mesačné predplatné. Je bežný názor, že si…

Apríla 29 2024