W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
HTTP 中間件提供一個方便的機制來過濾進入應(yīng)用程序的 HTTP 請求,例如,Laravel 默認包含了一個中間件來檢驗用戶身份驗證,如果用戶沒有經(jīng)過身份驗證,中間件會將用戶導(dǎo)向登錄頁面,然而,如果用戶通過身份驗證,中間件將會允許這個請求進一步繼續(xù)前進。
當然,除了身份驗證之外,中間件也可以被用來執(zhí)行各式各樣的任務(wù),CORS
中間件負責(zé)替所有即將離開程序的響應(yīng)加入適當?shù)捻憫?yīng)頭,一個日志中間件可以記錄所有傳入應(yīng)用程序的請求。 Laravel
框架已經(jīng)內(nèi)置一些中間件,包括維護、身份驗證、CSRF 保護,等等。所有的中間件都位于 app/Http/Middleware
目錄內(nèi)。
要建立一個新的中間件,可以使用 make:middleware
這個 Artisan 命令:
php artisan make:middleware OldMiddleware
此命令將會 在 app/Http/Middleware
目錄內(nèi)置立一個名稱為 OldMiddleware
的類。在這個中間件內(nèi)我們只允許 年齡
大于 200 的才能訪問路由,否則,我們會將用戶重新導(dǎo)向 「home」 的 URI 。
<?php namespace App\Http\Middleware;use Closure;class OldMiddleware { /** * Run the request filter. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if ($request->input('age') < 200) { return redirect('home'); } return $next($request); }}
如你所見,若是 年齡
小于 200
,中間件將會返回 HTTP 重定向給客戶端,否則,請求將會進一步傳遞到應(yīng)用程序。只需調(diào)用帶有 $request
的 $next
方法,即可將請求傳遞到更深層的應(yīng)用程序(允許跳過中間件) HTTP 請求在實際碰觸到應(yīng)用程序之前,最好是可以層層通過許多中間件,每一層都可以對請求進行檢查,甚至是完全拒絕請求。
在一個請求前后指定某個中間件取決于這個中間件自身。這個中間件可以執(zhí)行在請求前執(zhí)行一些 前置 操作:
<?php namespace App\Http\Middleware;use Closure;class BeforeMiddleware implements Middleware { public function handle($request, Closure $next) { // Perform action return $next($request); }}
然后,這個中間件也可以在請求后執(zhí)行一些 后置 操作:
<?php namespace App\Http\Middleware;use Closure;class AfterMiddleware implements Middleware { public function handle($request, Closure $next) { $response = $next($request); // Perform action return $response; }}
若是希望中間件被所有的 HTTP 請求給執(zhí)行,只要將中間件的類加入到 app/Http/Kernel.php
的 $middleware
屬性清單列表中。
如果你要指派中間件給特定的路由,你得先將中間件在 app/Http/Kernel.php
配置一個鍵值,默認情況下,這個文件內(nèi)的 $routeMiddleware
屬性已包含了 Laravel 目前配置的中間件,你只需要在清單列表中加上一組自定義的鍵值即可。 中間件一旦在 HTTP kernel 文件內(nèi)被定義,你即可在路由選項內(nèi)使用 middleware
鍵值來指派:
Route::get('admin/profile', ['middleware' => 'auth', function(){ //}]);
有些時候中間件需要在 HTTP 響應(yīng)已被發(fā)送到用戶端之后才執(zhí)行,例如,Laravel 內(nèi)置的 「session」 中間件,保存 session 數(shù)據(jù)是在響應(yīng)已被發(fā)送到用戶端 之后 才執(zhí)行。為了做到這一點,你需要定義中間件為「可終止的」。
use Closure;use Illuminate\Contracts\Routing\TerminableMiddleware;class StartSession implements TerminableMiddleware { public function handle($request, Closure $next) { return $next($request); } public function terminate($request, $response) { // Store the session data... }}
如你所見,除了定義 handle
方法之外, TerminableMiddleware
定義一個 terminate
方法。這個方法接收請求和響應(yīng)。一旦定義了 terminable 中間件,你需要將它增加到 HTTP kernel 文件的全局中間件清單列表中。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: