Laravel - 中介軟體



中介軟體充當請求和響應之間的橋樑,它是一種過濾機制。本章將向您解釋 Laravel 中的中介軟體機制。

Laravel 包含一箇中間件,用於驗證應用程式的使用者是否已透過身份驗證。如果使用者已透過身份驗證,則重定向到主頁;否則,重定向到登入頁面。

可以透過執行以下命令建立中介軟體:

php artisan make:middleware <middleware-name>

將**<middleware-name>**替換為您中介軟體的名稱。您建立的中介軟體可以在**app/Http/Middleware**目錄中看到。

示例

觀察以下示例以瞭解中介軟體機制:

**步驟 1** - 現在讓我們建立 AgeMiddleware。為此,我們需要執行以下命令:

php artisan make:middleware AgeMiddleware

**步驟 2** - 命令成功執行後,您將收到以下輸出:

AgeMiddleware

**步驟 3** - **AgeMiddleware** 將在 **app/Http/Middleware** 中建立。新建立的檔案將已經為您建立了以下程式碼。

<?php

namespace App\Http\Middleware;
use Closure;

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

註冊中介軟體

在使用中介軟體之前,我們需要註冊每一箇中間件。Laravel 中有兩種型別的中介軟體。

  • 全域性中介軟體
  • 路由中介軟體

**全域性中介軟體**將在應用程式的每個 HTTP 請求上執行,而**路由中介軟體**將分配給特定路由。中介軟體可以在**app/Http/Kernel.php**中註冊。此檔案包含兩個屬性**$middleware**和**$routeMiddleware**。**$middleware**屬性用於註冊全域性中介軟體,**$routeMiddleware**屬性用於註冊特定於路由的中介軟體。

要註冊全域性中介軟體,請在 $middleware 屬性的末尾列出類。

protected $middleware = [
   \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
   \App\Http\Middleware\EncryptCookies::class,
   \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
   \Illuminate\Session\Middleware\StartSession::class,
   \Illuminate\View\Middleware\ShareErrorsFromSession::class,
   \App\Http\Middleware\VerifyCsrfToken::class,
];

要註冊特定於路由的中介軟體,請向 $routeMiddleware 屬性新增鍵值對。

protected $routeMiddleware = [
   'auth' => \App\Http\Middleware\Authenticate::class,
   'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
   'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
];

示例

我們在前面的示例中建立了**AgeMiddleware**。我們現在可以在特定於路由的中介軟體屬性中註冊它。註冊程式碼如下所示。

以下是**app/Http/Kernel.php**的程式碼:

<?php

namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel {
   protected $middleware = [
      \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
      \App\Http\Middleware\EncryptCookies::class,
      \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
      \Illuminate\Session\Middleware\StartSession::class,
      \Illuminate\View\Middleware\ShareErrorsFromSession::class,
      \App\Http\Middleware\VerifyCsrfToken::class,
   ];
  
   protected $routeMiddleware = [
      'auth' => \App\Http\Middleware\Authenticate::class,
      'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
      'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
      'Age' => \App\Http\Middleware\AgeMiddleware::class,
   ];
}

中介軟體引數

我們還可以將引數與中介軟體一起傳遞。例如,如果您的應用程式具有不同的角色,例如使用者、管理員、超級管理員等,並且您希望根據角色對操作進行身份驗證,則可以透過傳遞中介軟體引數來實現此目的。我們建立的中介軟體包含以下函式,我們可以在**$next**引數之後傳遞自定義引數。

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

示例

**步驟 1** - 透過執行以下命令建立 RoleMiddleware:

php artisan make:middleware RoleMiddleware

**步驟 2** - 成功執行後,您將收到以下輸出:

Middleware Parameters

**步驟 3** - 在新建立的 **app/Http/Middleware/RoleMiddleware.php** 檔案的 handle 方法中新增以下程式碼。

<?php

namespace App\Http\Middleware;
use Closure;

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

**步驟 4** - 在 **app\Http\Kernel.php** 檔案中註冊 RoleMiddleware。在該檔案中新增灰色突出顯示的行以註冊 RoleMiddleware。

RoleMiddleware

**步驟 5** - 執行以下命令建立 **TestController**:

php artisan make:controller TestController --plain

**步驟 6** - 成功執行上述步驟後,您將收到以下輸出:

TestController

**步驟 7** - 將以下程式碼複製到 **app/Http/TestController.php** 檔案。

app/Http/TestController.php

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

**步驟 8** - 在 **app/Http/routes.php** 檔案中新增以下程式碼行。

app/Http/routes.php

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

**步驟 9** - 訪問以下 URL 以測試帶引數的中介軟體

https://:8000/role

**步驟 10** - 輸出將如下圖所示。

Role Editor

可終止中介軟體

可終止中介軟體在響應已傳送到瀏覽器後執行某些任務。這可以透過在中介軟體中建立具有**terminate**方法的中介軟體來實現。可終止中介軟體應與全域性中介軟體一起註冊。terminate 方法將接收兩個引數**$request**和**$response**。可終止方法可以像以下程式碼所示建立。

示例

**步驟 1** - 透過執行以下命令建立 **TerminateMiddleware**。

php artisan make:middleware TerminateMiddleware

**步驟 2** - 以上步驟將產生以下輸出:

Terminable Middleware

**步驟 3** - 將以下程式碼複製到新建立的 **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.";
   }
}

**步驟 4** - 在 **app\Http\Kernel.php** 檔案中註冊 **TerminateMiddleware**。在該檔案中新增灰色突出顯示的行以註冊 TerminateMiddleware。

TerminateMiddleware

**步驟 5** - 執行以下命令建立 **ABCController**。

php artisan make:controller ABCController --plain

**步驟 6** - URL 成功執行後,您將收到以下輸出:

ABCController

**步驟 7** - 將以下程式碼複製到 **app/Http/ABCController.php** 檔案。

app/Http/ABCController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

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

**步驟 8** - 在 **app/Http/routes.php** 檔案中新增以下程式碼行。

app/Http/routes.php

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

**步驟 9** - 訪問以下 URL 以測試可終止中介軟體。

https://:8000/terminate

**步驟 10** - 輸出將如下圖所示。

ABC Controller
廣告
© . All rights reserved.