Laravel中間件提供了一種新的方法來處理HTTP請求,這種方法有助於保持應用程序的可維護性和可擴展性,使開發人員能夠專註於業務邏輯而不是處理請求的細節。接下來我們將從多個方面來詳細闡述Laravel中間件。
一、中間件的基本概念
中間件可以看做是在請求到達控制器之前或之後執行的代碼。它們提供了一種方法來處理請求的細節,例如身份驗證、日誌記錄和請求過濾。這些中間件獨立於控制器、路由和請求處理流程,並可以被應用於多個路由和控制器。
在Laravel中,中間件可以由全局中間件、路由中間件和基於控制器的中間件組成。全局中間件可以用於整個應用程序,路由中間件可以用於特定的路由,基於控制器的中間件可以用於特定的控制器。
下面是一個簡單的中間件例子:
<?php
namespace App\Http\Middleware;
use Closure;
class CheckAge
{
public function handle($request, Closure $next)
{
if ($request->age < 18) {
return redirect('home');
}
return $next($request);
}
}
在這個例子中,我們定義了一個CheckAge中間件,會判斷來到的請求中是否帶有age參數,如果沒有或小於18,會進行重定向,否則就通過中間件繼續處理。
二、路由中的中間件
我們可以在路由中使用中間件,來在控制器處理請求前執行代碼,例如驗證用戶的身份、授權到訪問等。在Laravel中,路由中的中間件可以在中間鍵數組中指定。
可以使用路由名稱綁定中間件,這樣可以方便的在修改路由時不用修改中間件信息,如下:
Route::get('admin/profile', ['middleware' => 'auth', function () {
//
}]);
可以使用數組綁定多個中間件:
Route::get('admin/profile', ['middleware' => ['first', 'second'], function () {
//
}]);
也可以在路由實例上使用middleware方法來綁定中間件:
$route->middleware('auth');
三、全局中間件
全局中間件會對每一個通過應用程序的請求都進行處理。這使得開發人員可以輕鬆地添加由框架提供的功能,如響應壓縮和HTTPS重定向。Laravel已經默認為你定義了很多中間件,你可以在app/Http/Kernel.php找到它們。
你可以在Kernel.php 中的$middleware屬性中註冊全局中間件:
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\Illuminate\Foundation\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
// ...
];
你也可以在Kernel.php中的 $middlewareGroups 屬性中註冊中間件組。Laravel默認有web和api兩個中間件組。
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// ...
],
'api' => [
'throttle:60,1',
'auth:api',
],
];
四、基於控制器的中間件
除了路由中的中間件外,Laravel還提供了可以在控制器中使用的中間件。這些中間件可以讓你在特定控制器之前或之後對請求進行過濾或處理。
可以將中間件應用於控制器,例如:
namespace App\Http\Controllers;
use App\Http\Middleware\CheckAge;
class UserController extends Controller
{
/**
* Instantiate a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware(CheckAge::class);
}
}
在這個例子中,我們使用了剛才定義的CheckAge中間件來檢查用戶的年齡。我們在UserController的構造函數中調用了middleware方法,傳遞一個CheckAge實例作為參數。從而將中間件應用於這個控制器。
五、中間件的優先級
路由中間件、全局中間件的優先級可以在應用程序的核心中間件管理器(app/Http/Kernel.php)中指定,這使開發人員可以管理它們的中間件執行順序。當多個中間件被應用到同一個請求時,這些中間件將按照它們在應用程序的核心中間件管理器中定義的順序被調用。
protected $middlewarePriority = [
\Illuminate\Auth\Middleware\Authenticate::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\Routing\Middleware\ThrottleRequests::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
// ...
];
六、自定義中間件
當Laravel默認提供的中間件無法滿足您的需求時,您可以輕鬆地創建自己的中間件。Laravel使創建中間件變得非常容易,只需執行命令即可:
php artisan make:middleware CheckAge
這將在app/Http/Middleware目錄下創建匿名CheckAge PHP類。Laravel幫助您執行所有基本的類安裝,讓您可以立即開始編寫中間件的代碼。在handle方法中實現這個中間件:
public function handle($request, Closure $next)
{
if ($request->age < 18) {
return redirect('home');
}
return $next($request);
}
你也可以在constructor中注入剛才定義的CheckAge中間件:
<?php
namespace App\Http\Middleware;
use Closure;
class CheckAge
{
public function __construct(Request $request)
{
$this->request = $request;
}
public function handle($request, Closure $next)
{
if ($this->request->age < 18) {
return redirect('home');
}
return $next($request);
}
}
完整的自定義中間件例子:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class CheckAge
{
protected $request;
public function __construct(Request $request)
{
$this->request = $request;
}
public function handle($request, Closure $next)
{
if ($this->request->age < 18) {
return redirect('home');
}
return $next($request);
}
}
七、總結
本文詳細闡述了Laravel中間件的概念、路由中間件、全局中間件、基於控制器的中間件、中間件的優先級和自定義中間件。中間件提供了一種新的方法來處理HTTP請求,使得開發更加便捷和可維護。
原創文章,作者:ANGT,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/131671.html