Laravel中介軟體


正如其名稱提示,中介軟體作為請求和響應之間的中間人。它是一種過濾機制型別。例如,Laravel包括一個中介軟體用來驗證應用程式的使用者認證與否。如果使用者通過驗證,它將被重定向到主頁,否則將被重定向到登入頁面。
中介軟體可以通過執行以下命令來建立 -
php artisan make:middleware <middleware-name> 

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

範例

第1步 - 現在,讓我們建立 AgeMiddleware 中介軟體。我們需要執行下面的命令-
php artisan make:middleware AgeMiddleware
第2步 - 命令成功執行後,會收到以下輸出 -

第3步 ? AgeMiddlware 會在 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\Middlware\AgeMiddleware::class,
   ];
}

中介軟體引數

我們也可以傳遞中介軟體引數。例如,如果您的應用程式有不同角色,如使用者,管理員,超級管理員等,並且要驗證基於角色的動作,這可以通過引數傳遞中介軟體來實現。我們建立的中介軟體包含以下功能,我們可以通過 $next 引數之後,自定義引數。

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

範例

第1步 - 通過執行以下命令建立角色中介軟體 -
php artisan make:middleware RoleMiddleware
第2步 - 成功執行後,會收到以下輸出

第3步  ? 新增以下程式碼到新建立的角色中介軟體的處理方法 - app/Http/Middleware/RoleMiddleware.php.

<?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 中介軟體。

第5步 - 執行以下命令來建立測試控制器 -
php artisan make:controller TestController
第6步 - 成功執行後,您會收到以下輸出 -

第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步 - 存取以下網址來測試帶引數中介軟體

http://localhost:8000/role

第10步 - 輸出顯示如下圖中所示。

可終止的中介軟體

響應已經傳送給瀏覽器後可終止中介軟體執行一些任務。這可以通過使用建立中介軟體「終止」方法的中介軟體來實現。可終止中介軟體會註冊全域性中介軟體。該終止方法將接受兩個引數:$request 和 $response。終止方法可以被建立,如在下面顯示的程式碼。

範例

第1步- 通過執行以下命令建立 TerminateMiddleware 中介軟體。
php artisan make:middleware TerminateMiddleware
第2步 - 這將產生以下輸出 -

第3步 - 複製下面的程式碼到新建立檔案 - 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.";
   }
}

第4步  ? 註冊 TerminateMiddleware 到 app\Http\Kernel.php 檔案中.

加了灰色突出的線條的是該檔案中註冊的 TerminateMiddleware 中介軟體。

第5步 - 執行以下命令來建立一個控制器。
php artisan make:controller ABCController
第6步 - URL成功執行後,會收到以下輸出 -

第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步 - 存取以下網址測試可終止中介軟體。

http://localhost:8000/terminate

第10步 - 如下面的圖片輸出的結果。