您好,登錄后才能下訂單哦!
本篇內容介紹了“Thinkphp5.1中間件怎么用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
中間件主要用于攔截或過濾應用的HTTP
請求,并進行必要的業務處理。比如可以使用中間件來檢查用戶的請求信息里是否包含一句話木馬。
行為鉤子和中間件的區別:
中間件:它是對項目請求做處理,在用戶訪問我們的項目時,中間件就可以對于這個請求來判斷用戶是否有權限,或者判斷用戶是否存在非法訪問;
行為鉤子:在某一動作開始或者結束的時候會觸發的方法,比如用戶注冊成功記錄日志;
中間件是對用戶請求做處理,而鉤子則是對用戶動作的處理,中間件相當于過濾器,鉤子相當于事件,都是采用AOP思想。
首先,可以通過cmd命令行指令快速生成中間件,在項目的根目錄里執行以下cmd命令:
php think make:middleware Check
這個指令會 application/http/middleware
目錄下面生成一個Check
中間件,代碼如下:
<?php namespace app\http\middleware; class Check { public function handle($request, \Closure $next) { if ($request->param('name') == 'index') { return redirect('/');//重定向到首頁 } return $next($request);//返回的是一個Response對象 } }
中間件說明:
1、中間件的入口執行方法必須是
handle
方法,而且第一個參數是Request
對象,第二個參數是一個閉包;2、中間件
handle
方法的返回值必須是一個Response
對象;3、中間件里可以直接使用Request對象,獲取請求參數;
4、在某些需求下,可以使用第三個參數傳入額外的參數;
public function handle($request, \Closure $next, $name){ if ($name == 'index') { return redirect('/');//重定向到首頁 } return $next($request); }
前置中間件的意思就是,在http請求完成之前,先執行中間件的代碼。
<?php namespace app\http\middleware; class Before { public function handle($request, \Closure $next) { // 先執行中間件代碼 return $next($request); } }
后置中間件的意思就是,在http請求完成之后,才開始執行中間件的代碼。
<?php namespace app\http\middleware; class After { public function handle($request, \Closure $next) { $response = $next($request); //后執行中間件代碼 return $response; } }
顧名思義,就是指定在某個路由下才會去調用這個中間件,即用戶訪問了這個路由鏈接,就會執行這個中間件。
//用戶登錄的路由 Route::rule('login','index/User/login')->middleware('Auth');
或者使用完整的中間件類名:
Route::rule('login','index/User/login')->middleware(app\http\middleware\Auth::class);
說明:中間件的注冊建議使用完整的類名,如果沒有指定命名空間則默認使用
app\http\middleware
作為命名空間
同一個路由也支持注冊多個中間件,只需要middleware()里用逗號隔開即可:
Route::rule('login','index/User/login')->middleware(['Auth', 'Check']);
Thinkphp5.1.8+ 版本后,支持對路由分組注冊中間件,如下:
//一個名為user的路由分組 Route::group('user', function(){ Route::rule('login','index/User/login'); Route::rule('register','index/User/register'); })->middleware('Auth');
意思就是說,所有的(全局)http訪問請求,都會自動調用這個中間件。
在application目錄下創建middleware.php文件,代碼如下:
<?php return [ //第1個中間件 \app\http\middleware\Auth::class, //第2個中間件(Check中間件沒有指定命名空間,所以會默認使用app\http\middleware作為命名空間) 'Check', ];
Thinkphp5.1.8+
版本以上支持模塊中間件定義,你可以直接在模塊目錄下面增加middleware.php
文件,定義方式和全局中間件定義一樣,只是只會在該模塊下面生效。
Thinkphp5.1.17+
版本以上支持為控制器定義中間件。首先你的控制器需要繼承系統的think\Controller
類,然后在控制器中定義middleware
屬性,例如:
<?php namespace app\index\controller; use think\Controller; class Index extends Controller{ protected $middleware = ['Auth']; public function index() { return 'index'; } }
在某些簡單的場合,我們不需要使用中間件類,這時候可以使用閉包定義中間件,但閉包函數必須返回Response
對象實例。
Route::group('hello', function(){ Route::rule('login','index/User/login'); })->middleware(function($request,\Closure $next){ if ($request->param('name') == 'index') { return redirect('/');//重定向到首頁 } return $next($request); });
1、全局中間件傳參數
<?php return [ [\app\http\middleware\Auth::class, '張三'], 'Check:李四', ];
上面的定義表示給Auth中間件傳入參數為張三,給Check中間件傳入參數為李四
2、路由中間件傳參數
(1)、給Auth中間件傳入參數張三
Route::rule('login','index/User/login')->middleware('Auth:張三');
也可以這樣寫:
Route::rule('login','index/User/login')->middleware(Auth::class, '張三');
(2)、給多個中間件傳入同一個參數
Route::rule('login','index/User/login')->middleware([Auth::class, 'Check'], '張三');
(3)、單獨指定各個中間件的參數
Route::rule('login','index/user/login')->middleware(['Auth:張三', 'Check:李四']);
前面講的給中間件傳入特定的參數 (常量),那么中間要如何向控制器傳入參數呢?我們可以通過給Request請求對象賦值的方式傳參給控制器(或者其它地方),例如:
<?php namespace app\http\middleware; class Auth { public function handle($request, \Closure $next) { //給控制器傳參數 $request->result = '驗證成功'; return $next($request); } }
需要特別注意:傳遞的變量名稱不要和Request已有的參數變量名有沖突,比如用戶登錄請求的Request參數里已經有一個username,那么中間件向控制器傳參,就不能再用這個username了,否則會改變原來參數的值。
然后在控制器的方法里面可以直接使用:
public function index(Request $request) { return $request->result; }
“Thinkphp5.1中間件怎么用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。