用品

Laravel 中間件是如何工作的

Laravel 中間件是介於用戶請求和應用程序響應之間的中間應用層。

這意味著當用戶(Laravel 視圖)向服務器(Laravel 控制器)發出請求時,請求將通過中間件。 這樣中間件可以檢查請求是否經過身份驗證: 

  • 如果用戶的請求通過驗證,則將請求發送到後端;
  • 如果用戶的請求未經身份驗證,中間件會將用戶重定向到登錄屏幕。

Laravel 允許你 defi完成並使用附加中間件來執行除身份驗證之外的各種任務。 

Laravel 中間件,例如身份驗證和 CSRF 保護,位於目錄中 應用程序/HTTP/中間件 .

因此我們可以說中間件是一個 http 請求過濾器,通過它可以驗證條件並執行操作。

創建中間件

要創建一個新的中間件,我們運行以下命令:

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

我們創造了 middleware 我們稱之為 CheckAge, artisan 會回答我們如下:

上面的窗口顯示中間件已成功創建,名稱為“ 檢查年齡 “。

查看CheckAge中間件是否創建,進入app/Http/Middleware文件夾下的項目,會看到新建的文件

新建的文件有如下代碼

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

使用中間件

要使用中間件,我們需要註冊它。

Laravel 中有兩種類型的中間件:

  • Middleware globale
  • Route Middleware

Il 全局中間件 將在來自應用程序的每個 HTTP 請求上執行,而 路由中間件 將被分配到一個特定的路徑。 中間件可以註冊在 應用程序/Http/Kernel.php。 該文件包含兩個屬性 $中間件 e $路由中間件 . $中間件屬性 用於註冊全局中間件和所有權 $路由中間件 用於註冊特定於路由的中間件。

要註冊全局中間件,請在 $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,
    ];

要註冊特定於路由的中間件,請將鍵和值添加到 $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,
    ];

我們創造了 檢查年齡 在前面的例子中。 我們現在可以在中間件路由屬性中註冊它。 此類註冊的代碼如下所示。

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

中間件參數

我們也可以用中間件傳遞參數。 

例如,如果您的應用程序具有不同的角色,如用戶、管理員、超級管理員等。 並且您想根據角色對操作進行身份驗證,可以通過使用中間件傳遞參數來實現。 

我們創建的中間件包含以下函數,我們可以在參數後傳遞自定義參數 $下一步 .

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

現在讓我們嘗試將角色參數設置為我們要從頭開始創建的新中間件,然後通過運行以下命令繼續創建角色中間件

修改handle方法如下

<?php

namespace App\Http\Middleware;
use Closure;

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

我們添加了參數 $role, 以及方法內部的行 echo 寫入輸出角色的名稱。

創新通訊
不要錯過有關創新的最重要新聞。 註冊以通過電子郵件接收它們。

現在讓我們為特定路徑註冊 RoleMiddleware 中間件

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

現在要使用參數測試中間件,我們需要創建一個請求和一個響應。 為了模擬響應,讓我們創建我們將調用 TestController 的控制器

php artisan make:controller TestController --plain

剛剛執行的命令將在文件夾中創建一個新的控制器 app/Http/TestController.php, 並改變方法 index 用線 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.";
   }
}

設置響應後,我們通過編輯文件來構建請求 routes.php通過添加 route role

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

此時我們可以通過訪問 URL 來嘗試示例 http://localhost:8000/role

在瀏覽器中我們會看到這兩個 echo

Role editor
Test Controller

可終止中間件

Il terminable Middleware 在響應發送到瀏覽器後執行一些任務。 這可以通過使用方法創建中間件來實現 終止於中間件。 Il terminable Middleware 必須註冊 middleware 全球的。 方法 terminate 將收到兩個參數 $請求 e $響應。 

方法 Terminate 必須按以下代碼所示創建。

php artisan make:middleware TerminateMiddleware

一旦創建了中間件 app/Http/Middleware/TerminateMiddleware.php 讓我們修改代碼如下

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

在這種情況下,我們有一個方法 handle 和一個方法 terminate 有兩個參數 $request e $response.

現在讓我們註冊中間件

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

現在我們需要創建控制器來模擬響應

php artisan make:controller XYZController --plain

修改類的內容

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

現在我們需要編輯文件 routes/web.php 添加激活請求所需的路由

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

此時我們可以通過訪問 URL 來嘗試示例 http://localhost:8000/terminate

在瀏覽器中我們將看到以下幾行

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

Ercole Palmeri

你可能也喜歡:

創新通訊
不要錯過有關創新的最重要新聞。 註冊以通過電子郵件接收它們。

最近的文章

如何統計在線發布的文件中包含的字元數?

字元是文字的各個元素。它們可以是字母、標點符號、數字、空格和符號。每一個字…

3月29 2024

智慧鎖市場:市場研究報告發布

智慧鎖市場一詞是指圍繞生產、分銷和使用的行業和生態系統…

3月27 2024

什麼是設計模式:為什麼要使用它們、分類、優點和缺點

在軟體工程中,設計模式是軟體設計中常見問題的最佳解決方案。我很像…

3月26 2024

工業標識的技術演變

工業標記是一個廣泛的術語,包含多種用於在...表面建立永久標記的技術。

3月25 2024