laravel 中間件是在請(qǐng)求到達(dá)應(yīng)用前或響應(yīng)離開后執(zhí)行的代碼,用于處理權(quán)限驗(yàn)證、日志記錄等任務(wù)。1.生成中間件:使用 artisan 命令 php artisan make:middleware yourmiddlewarename 創(chuàng)建新中間件類。2.編輯中間件:在 handle 方法中編寫邏輯,如檢查請(qǐng)求參數(shù)或修改請(qǐng)求對(duì)象。3.注冊(cè)中間件:可在 kernel.php 的 $middleware 數(shù)組中注冊(cè)為全局中間件,或在 $routemiddleware 數(shù)組中注冊(cè)并分配別名以供路由使用。4.在路由或控制器中使用中間件:通過 ->middleware(‘yourmiddleware’) 應(yīng)用。5.訪問 Session:可通過 $request->session() 獲取 session 數(shù)據(jù)并進(jìn)行判斷或重定向。6.修改請(qǐng)求或響應(yīng):可調(diào)用 $request->merge() 添加參數(shù),或通過 $response->headers->set() 添加頭部信息。7.中間件執(zhí)行順序:全局中間件按 kernel.php 中定義順序執(zhí)行,路由中間件按路由定義順序執(zhí)行,而響應(yīng)階段則以相反順序執(zhí)行。
中間件,簡單來說,就是請(qǐng)求到達(dá)你的應(yīng)用之前或者響應(yīng)離開你的應(yīng)用之后,可以執(zhí)行的一段代碼。在 laravel 中,自定義中間件能讓你靈活地處理各種 http 請(qǐng)求,比如權(quán)限驗(yàn)證、日志記錄,甚至修改請(qǐng)求或響應(yīng)本身。
解決方案:
-
生成中間件: 使用 Artisan 命令 php artisan make:middleware YourMiddlewareName。這會(huì)在 app/Http/Middleware 目錄下創(chuàng)建一個(gè)新的中間件類。
-
編輯中間件: 打開新生成的中間件文件,你會(huì)看到一個(gè) handle 方法。在這里編寫你的邏輯。例如,一個(gè)簡單的示例:
<?php namespace AppHttpMiddleware; use Closure; use IlluminateHttpRequest; class YourMiddlewareName { public function handle(Request $request, Closure $next) { if ($request->input('secret') !== 'correct_secret') { return response('Unauthorized.', 401); } return $next($request); } }
這個(gè)例子檢查請(qǐng)求中是否包含一個(gè)名為 secret 的參數(shù),并且其值是否為 correct_secret。如果不匹配,則返回 401 未授權(quán)響應(yīng)。$next($request) 表示將請(qǐng)求傳遞給下一個(gè)中間件或路由。
-
注冊(cè)中間件: 你需要在 app/Http/Kernel.php 文件中注冊(cè)你的中間件。有兩種方式:
- 全局中間件: 添加到 $middleware 數(shù)組中。全局中間件會(huì)應(yīng)用于每個(gè)請(qǐng)求。
- 路由中間件: 添加到 $routeMiddleware 數(shù)組中,并分配一個(gè)別名。然后你可以在路由中使用這個(gè)別名。
// app/Http/Kernel.php protected $routeMiddleware = [ 'auth' => AppHttpMiddlewareAuthenticate::class, 'auth.basic' => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class, 'bindings' => IlluminateRoutingMiddlewareSubstituteBindings::class, 'cache.headers' => IlluminateHttpMiddlewareSetCacheHeaders::class, 'can' => IlluminateAuthMiddlewareAuthorize::class, 'guest' => AppHttpMiddlewareredirectIfAuthenticated::class, 'throttle' => IlluminateRoutingMiddlewareThrottleRequests::class, 'yourmiddleware' => AppHttpMiddlewareYourMiddlewareName::class, // 注冊(cè)你的中間件 ];
-
在路由中使用中間件: 如果你注冊(cè)了路由中間件,你就可以在你的路由中使用它了。
Route::get('/profile', function () { // 只有通過中間件驗(yàn)證的用戶才能訪問 })->middleware('yourmiddleware');
或者,你也可以在控制器中使用:
public function __construct() { $this->middleware('yourmiddleware'); }
如何在中間件中訪問 Session?
Laravel 的 Session 管理非常方便。在你的中間件中,你可以像在控制器中一樣訪問 Session。例如:
public function handle(Request $request, Closure $next) { $userId = $request->session()->get('user_id'); if (!$userId) { return redirect('/login'); } return $next($request); }
這個(gè)例子檢查 Session 中是否存在 user_id。如果不存在,則重定向到登錄頁面。 記得確保你的應(yīng)用配置了 Session 中間件,通常 Laravel 默認(rèn)已經(jīng)配置好了。
如何修改請(qǐng)求或響應(yīng)?
中間件的強(qiáng)大之處在于它可以修改請(qǐng)求和響應(yīng)。例如,你可以在請(qǐng)求到達(dá)控制器之前修改請(qǐng)求參數(shù),或者在響應(yīng)返回給客戶端之前添加額外的頭部信息。
-
修改請(qǐng)求: 你可以直接修改 $request 對(duì)象。
public function handle(Request $request, Closure $next) { $request->merge(['new_param' => 'some_value']); // 添加新的請(qǐng)求參數(shù) return $next($request); }
-
修改響應(yīng): 在 $next($request) 之后,你可以訪問并修改響應(yīng)。
public function handle(Request $request, Closure $next) { $response = $next($request); $response->headers->set('X-Custom-Header', 'Custom Value'); // 添加自定義頭部 return $response; }
中間件的執(zhí)行順序是怎樣的?
中間件的執(zhí)行順序非常重要。全局中間件按照 app/Http/Kernel.php 中 $middleware 數(shù)組的順序執(zhí)行。路由中間件按照它們?cè)诼酚啥x中的順序執(zhí)行。需要注意的是,中間件在請(qǐng)求到達(dá)之前執(zhí)行的順序,與響應(yīng)離開時(shí)執(zhí)行的順序是相反的。這允許你在請(qǐng)求到達(dá)之前進(jìn)行一些準(zhǔn)備工作,然后在響應(yīng)離開時(shí)進(jìn)行清理或日志記錄。