Laravel中間件的使用詳解
目錄
- 一:創建中間件
- 二:前置和后置中間件
- 1:前置中間件
- 2:后置中間件
- 三:注冊中間件
- 1:注冊全局中間件
- 2:為路由分配中間件
- 3:中間件組
- 4:排序中間件
- 5:中間件參數
- 6:Terminable 中間件
Laravel 中間件提供了一種方便的機制來過濾進入應用的 HTTP 請求。例如,Laravel 內置了一個中間件來驗證用戶的身份認證。如果用戶沒有通過身份認證,中間件會將用戶重定向到登錄界面。但是,如果用戶被認證,中間件將允許該請求進一步進入該應用,所有中間件都位于 app/Http/Middleware 目錄下
一:創建中間件
使用 make:middleware 命令來創建新的中間件
php artisan make:middleware CheckAge #CheckAge表示的是中間件文件名稱
該命令將會在 app/Http/Middleware 目錄內新建一個 CheckAge 類
在這個中間件里,我們僅允許提供的參數 id 大于 200 的請求訪問該路由。否則,我們會將用戶重定向到 home
<?php namespace App\Http\Middleware; use Closure; class CheckAge { /** * 處理傳入的請求 * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if ($request->id<= 200) { return redirect("home"); } return $next($request); } }
二:前置和后置中間件
中間件是在請求之前或之后運行取決于中間件本身
1:前置中間件
<?php namespace App\Http\Middleware; use Closure; class BeforeMiddleware { public function handle($request, Closure $next) { // 執行動作 return $next($request); } }
2:后置中間件
<?php namespace App\Http\Middleware; use Closure; class AfterMiddleware { public function handle($request, Closure $next) { $response = $next($request); // 執行動作 return $response; } }
三:注冊中間件
1:注冊全局中間件
如果你想讓中間件在你應用的每個 HTTP 請求期間運行,只需在 app/Http/Kernel.php 類中的 $middleware 屬性里列出這個中間件類
protected $middleware = [ \App\Http\Middleware\TrustProxies::class, \App\Http\Middleware\CheckForMaintenanceMode::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, ];
2:為路由分配中間件
如果想為指定的路由配置中間件,首先應該在 app/Http/Kernel.php 文件內為該中間件指定一個鍵。默認情況下,Kernel 類的 $routeMiddleware 屬性包含 Laravel 內置的中間件條目。要加入自定義的,只需把它附加到列表后并為其分配一個自定義鍵即可
protected $routeMiddleware = [ "auth" => \App\Http\Middleware\Authenticate::class, "auth.basic" => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, "bindings" => \Illuminate\Routing\Middleware\SubstituteBindings::class, "cache.headers" => \Illuminate\Http\Middleware\SetCacheHeaders::class, "can" => \Illuminate\Auth\Middleware\Authorize::class, "guest" => \App\Http\Middleware\RedirectIfAuthenticated::class, "signed" => \Illuminate\Routing\Middleware\ValidateSignature::class, "throttle" => \Illuminate\Routing\Middleware\ThrottleRequests::class, "verified" => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, ];
一旦在 Kernel 中定義了中間件,就可使用 middleware 方法將中間件分配給路由
Route::get("admin/profile", function () { // })->middleware("auth");
你還可以為路由分配多個中間件
Route::get("/", function () { // })->middleware("first", "second");
分配中間件時,你還可以傳遞完整的類名
use App\Http\Middleware\CheckAge; Route::get("admin/profile", function () { // })->middleware(CheckAge::class);
3:中間件組
有時你可能想用單一的鍵為幾個中間件分組,使其更容易分配到路由。可以使用 Kernel 類的 $middlewareGroups 屬性來實現
protected $middlewareGroups = [ "web" => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], "api" => [ "throttle:60,1", "bindings", ], ];
可以使用與單個中間件相同的語法將中間件組分配給路由和控制器操作
Route::get("/", function () { // })->middleware("web"); Route::group(["middleware" => ["web"]], function () { // });
4:排序中間件
很少情況下,你可能需要中間件以特定的順序執行,但是當它們被分配到路由時,你無法控制它們的順序。在這種情況下,可以使用 app/Http/Kernel.php 文件的 $middlewarePriority 屬性指定中間件優先級
protected $middlewarePriority = [ \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\Authenticate::class, \Illuminate\Routing\Middleware\ThrottleRequests::class, \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, \Illuminate\Auth\Middleware\Authorize::class, ];
5:中間件參數
中間件也可以接受額外的參數。例如,如果應用需要在運行特定操作前驗證經過身份認證的用戶是否具備給定的「角色」,你可以新建一個 CheckRole 中間件,由它來接收「角色」名稱作為附加參數。
附加的中間件參數應該在 $next 參數之后被傳遞:
<?php namespace App\Http\Middleware; use Closure; class CheckRole { /** * 處理傳入的請求 * * @param \Illuminate\Http\Request $request * @param \Closure $next * @param string $role * @return mixed */ public function handle($request, Closure $next, $role) { if (! $request->user()->hasRole($role)) { // 重定向... } return $next($request); } }
定義路由時通過一個 : 來隔開中間件名稱和參數來指定中間件參數。多個參數就使用逗號分隔
Route::put("post/{id}", function ($id) { // })->middleware("role:editor");
6:Terminable 中間件
laravel 內置的「session」中間件會在響應發送到瀏覽器之后將會話數據寫入存儲器中。如果你在中間件中定義一個 terminate 方法,則會在響應發送到瀏覽器后自動調用
<?php namespace Illuminate\Session\Middleware; use Closure; class StartSession { public function handle($request, Closure $next) { return $next($request); } public function terminate($request, $response) { // Store the session data... } }
terminate 方法應該同時接收和響應。一旦定義了這個中間件,你應該將它添加到路由列表或 app/Http/Kernel.php 文件的全局中間件中
在你的中間件上調用 terminate 調用時,Laravel 會從 服務容器 中解析出一個新的中間件實例。如果要在調用 handle 和 terminate 方法時使用同一個中間件實例,就使用容器的 singleton 方法向容器注冊中間件
到此這篇關于Laravel中間件的使用詳解的文章就介紹到這了,更多相關Laravel中間件內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!