鍍金池/ 教程/ PHP/ Laravel中間件
Laravel操作數(shù)據(jù)庫
Laravel會(huì)話(session)
Laravel文件上傳
Laravel Cookie
Laravel Facades
Laravel應(yīng)用程序結(jié)構(gòu)
Laravel響應(yīng)
Laravel插入數(shù)據(jù)庫表數(shù)據(jù)
Laravel錯(cuò)誤處理
Laravel環(huán)境安裝配置
Laravel本地化
Laravel Ajax
Laravel路由
Laravel錯(cuò)誤和日志記錄
Laravel檢索查詢數(shù)據(jù)
Laravel更新數(shù)據(jù)
Laravel刪除數(shù)據(jù)
Laravel表單處理
Laravel中間件
Laravel控制器
Laravel驗(yàn)證
Laravel安全
Laravel請(qǐng)求
Laravel發(fā)送郵件
Laravel重定向
Laravel教程
Laravel配置
Laravel事件處理
Laravel視圖

Laravel中間件

正如其名稱提示,中間件作為請(qǐng)求和響應(yīng)之間的中間人。它是一種過濾機(jī)制類型。例如,Laravel包括一個(gè)中間件用來驗(yàn)證應(yīng)用程序的用戶認(rèn)證與否。如果用戶通過驗(yàn)證,它將被重定向到主頁,否則將被重定向到登錄頁面。
中間件可以通過執(zhí)行以下命令來創(chuàng)建 -
php artisan make:middleware <middleware-name> 

使用你的中間件名稱替換<middleware-name>。創(chuàng)建可以看到中間件在 app/Http/Middleware 目錄。

示例

第1步 - 現(xiàn)在,讓我們創(chuàng)建 AgeMiddleware 中間件。我們需要執(zhí)行下面的命令-
php artisan make:middleware AgeMiddleware
第2步 - 命令成功執(zhí)行后,會(huì)收到以下輸出 -

第3步 ? AgeMiddlware 會(huì)在 app/Http/Middleware 文件中創(chuàng)建。新創(chuàng)建的文件將自動(dòng)創(chuàng)建下面代碼:

<?php
namespace App\Http\Middleware;
use Closure;

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

注冊(cè)中間件

我們需要在使用前注冊(cè)每一個(gè)中間件。在Laravel有兩種類型的中間件。
  • 全局中間件
  • 路由中間件

全局中間件將在應(yīng)用程序的每個(gè)HTTP請(qǐng)求運(yùn)行,而路由中間件將被分配到一個(gè)特定的路由。中間件可在 app/Http/Kernel.php 注冊(cè). 
該文件包含兩個(gè)屬性: $middleware 和 $routeMiddleware。$middleware 屬性用于注冊(cè)全局中間件,$routeMiddleware屬性用于注冊(cè)路由指定中間件。

要注冊(cè)全局中間件,列出的類在 $middleware 屬性的結(jié)尾。
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,
];
要注冊(cè)路由特定中間件,添加鍵和值到$routeMiddleware 屬性。
protected $routeMiddleware = [
   'auth' => \App\Http\Middleware\Authenticate::class,
   'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
   'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
];

示例

我們已經(jīng)在前面的例子中已創(chuàng)建 AgeMiddleware 中間件。 現(xiàn)在,我們可以在具體的路由中間件屬性登記。注冊(cè)代碼如下所示。

以下是應(yīng)用程序代碼 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,
   ];
}

中間件參數(shù)

我們也可以傳遞中間件參數(shù)。例如,如果您的應(yīng)用程序有不同角色,如用戶,管理員,超級(jí)管理員等,并且要驗(yàn)證基于角色的動(dòng)作,這可以通過參數(shù)傳遞中間件來實(shí)現(xiàn)。我們創(chuàng)建的中間件包含以下功能,我們可以通過 $next 參數(shù)之后,自定義參數(shù)。

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

示例

第1步 - 通過執(zhí)行以下命令創(chuàng)建角色中間件 -
php artisan make:middleware RoleMiddleware
第2步 - 成功執(zhí)行后,會(huì)收到以下輸出

第3步  ? 添加以下代碼到新創(chuàng)建的角色中間件的處理方法 - 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 文件中注冊(cè)角色中間件。 加入灰色突出的線條的是在該文件中注冊(cè) RoleMiddleware 中間件。

第5步 - 執(zhí)行以下命令來創(chuàng)建測(cè)試控制器 -
php artisan make:controller TestController
第6步 - 成功執(zhí)行后,您會(huì)收到以下輸出 -

第7步 - 將以下代碼復(fù)制到 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步 - 訪問以下網(wǎng)址來測(cè)試帶參數(shù)中間件

http://localhost:8000/role

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

可終止的中間件

響應(yīng)已經(jīng)發(fā)送給瀏覽器后可終止中間件執(zhí)行一些任務(wù)。這可以通過使用創(chuàng)建中間件“終止”方法的中間件來實(shí)現(xiàn)??山K止中間件會(huì)注冊(cè)全局中間件。該終止方法將接受兩個(gè)參數(shù):$request 和 $response。終止方法可以被創(chuàng)建,如在下面顯示的代碼。

示例

第1步- 通過執(zhí)行以下命令創(chuàng)建 TerminateMiddleware 中間件。
php artisan make:middleware TerminateMiddleware
第2步 - 這將產(chǎn)生以下輸出 -

第3步 - 復(fù)制下面的代碼到新創(chuàng)建文件 - 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步  ? 注冊(cè) TerminateMiddleware 到 app\Http\Kernel.php 文件中.

加了灰色突出的線條的是該文件中注冊(cè)的 TerminateMiddleware 中間件。

第5步 - 執(zhí)行以下命令來創(chuàng)建一個(gè)控制器。
php artisan make:controller ABCController
第6步 - URL成功執(zhí)行后,會(huì)收到以下輸出 -

第7步 - 將以下代碼復(fù)制到 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步 - 訪問以下網(wǎng)址測(cè)試可終止中間件。

http://localhost:8000/terminate

第10步 - 如下面的圖片輸出的結(jié)果。


上一篇:Laravel教程下一篇:Laravel事件處理