Články

Laravel middleware, jak to funguje

Laravel middleware je mezilehlá aplikační vrstva, která zasahuje mezi požadavek uživatele a odpověď aplikace.

To znamená, že když uživatel (pohled Laravel) zadá požadavek na server (řadič Laravel), požadavek projde middleware. Tímto způsobem může middleware zkontrolovat, zda je požadavek ověřen nebo ne: 

  • pokud je požadavek uživatele autentizován, je požadavek odeslán na backend;
  • pokud je požadavek uživatele neověřený, middleware přesměruje uživatele na přihlašovací obrazovku.

Laravel vám to umožňuje defidokončit a používat další middleware k provádění různých úloh kromě ověřování. 

Middleware Laravel, jako je autentizace a CSRF ochrana, jsou umístěny v adresáři aplikace/Http/Middleware .

Můžeme tedy říci, že middleware je http filtr požadavků, přes který je možné ověřovat podmínky a provádět akce.

Vytváření middlewaru

Pro vytvoření nového middlewaru spustíme následující příkaz:

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

Vytváříme middleware a říkáme tomu CheckAge, artisan nám odpoví následovně:

Výše uvedené okno ukazuje, že middleware byl úspěšně vytvořen s názvem “ CheckAge ".

Chcete-li zjistit, zda je middleware CheckAge vytvořen nebo ne, přejděte do projektu ve složce app/Http/Middleware a uvidíte nově vytvořený soubor

Nově vytvořený soubor má následující 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žijte middleware

Abychom mohli používat middleware, musíme jej zaregistrovat.

V Laravelu existují dva typy middlewaru:

  • Middleware globale
  • Route Middleware

Il globální middleware budou provedeny při každém požadavku HTTP z aplikace, zatímco Middleware trasy bude přiřazena ke konkrétní cestě. Middleware lze zaregistrovat na app/Http/Kernel.php. Tento soubor obsahuje dvě vlastnosti $middleware e $routeMiddleware . Vlastnost $middleware se používá k registraci globálního middlewaru a vlastnictví $routeMiddleware se používá k registraci middlewaru specifického pro trasu.

Chcete-li zaregistrovat globální middleware, uveďte třídu 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,
    ];

Chcete-li zaregistrovat middleware specifický pro trasu, přidejte klíč 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,
    ];

Vytvořili jsme CheckAge v předchozím příkladu. Nyní to můžeme zaregistrovat ve vlastnosti middlewaru route. Kód pro takovou registraci je uveden níže.

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

Parametry middlewaru

Parametry můžeme předávat i pomocí Middleware. 

Pokud má vaše aplikace například různé role, jako je uživatel, správce, superadministrátor atd. a chcete autentizovat akci na základě role, můžete to udělat předáním parametrů middlewaru. 

Middleware, který jsme vytvořili, obsahuje následující funkci a po argumentu můžeme předat vlastní argumenty $další .

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

Nyní zkusme nastavit parametr role na nový middleware, který se chystáme vytvořit od začátku, a poté pokračujte k vytvoření Role Middleware spuštěním následujícího příkazu

Upravte metodu rukojeti následovně

<?php

namespace App\Http\Middleware;
use Closure;

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

přidali jsme parametr $rolea uvnitř metody řádek echo k napsání výstupu název role.

Inovační zpravodaj
Nenechte si ujít nejdůležitější novinky o inovacích. Přihlaste se k jejich odběru e-mailem.

Nyní zaregistrujme middleware RoleMiddleware pro konkrétní 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,
    ];

Nyní, abychom otestovali middleware s parametrem, musíme vytvořit požadavek a odpověď. Pro simulaci odezvy vytvořte kontrolér, který budeme nazývat TestController

php artisan make:controller TestController --plain

právě provedený příkaz vytvoří ve složce nový ovladač app/Http/TestController.phpa změňte metodu 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í odpovědi sestavíme požadavek úpravou souboru routes.phppřidáním route role

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

v tomto okamžiku můžeme vyzkoušet příklad návštěvou URL http://localhost:8000/role

a v prohlížeči uvidíme ty dva echo

Role editor
Test Controller

Ukončitelný middleware

Il terminable Middleware provádí některé úkoly po odeslání odpovědi do prohlížeče. Toho lze dosáhnout vytvořením middlewaru s touto metodou ukončit v middlewaru. Il terminable Middleware musí být registrován u middleware globální. Metoda terminate dostane dva argumenty $žádost e $response. 

Metoda Terminate musí být vytvořen, jak je znázorněno v následujícím kódu.

php artisan make:middleware TerminateMiddleware

Jakmile je vytvořen middleware app/Http/Middleware/TerminateMiddleware.php upravíme kód následovně

<?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 případě máme metodu handle a způsob terminate se dvěma parametry $request e $response.

Nyní zaregistrujeme 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,
    ];

Nyní musíme vytvořit regulátor pro simulaci odezvy

php artisan make:controller XYZController --plain

úprava obsahu třídy

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

Nyní musíme soubor upravit routes/web.php přidání tras potřebných k aktivaci požadavku

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

v tomto okamžiku můžeme vyzkoušet příklad návštěvou URL http://localhost:8000/terminate

a v prohlížeči uvidíme následující řádky

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

Ercole Palmeri

Také by se vám mohlo líbit:

Inovační zpravodaj
Nenechte si ujít nejdůležitější novinky o inovacích. Přihlaste se k jejich odběru e-mailem.

Nedávné články

Výhody omalovánek pro děti - svět kouzel pro všechny věkové kategorie

Rozvíjení jemné motoriky prostřednictvím vybarvování připravuje děti na složitější dovednosti, jako je psaní. Barvit…

2. května 2024

Budoucnost je tady: Jak lodní průmysl revolucionizuje globální ekonomiku

Námořní sektor je skutečnou globální ekonomickou velmocí, která se dostala na 150miliardový trh...

1. května 2024

Vydavatelé a OpenAI podepisují dohody o regulaci toku informací zpracovávaných umělou inteligencí

Minulé pondělí Financial Times oznámily dohodu s OpenAI. FT licencuje svou prvotřídní žurnalistiku…

30. dubna 2024

Online platby: Zde je návod, jak vám streamovací služby umožňují platit navždy

Miliony lidí platí za streamovací služby a platí měsíční předplatné. Je obecný názor, že jste…

29. dubna 2024