中間件是什麼?有什麼做用?
中間件主要用於攔截或過濾應用的HTTP請求,並進行必要的業務處理。---tp5.1手冊
也就是說,下降了系統的耦合;【在http請求階段,執行中間件的入口執行方法(handle)--tp5.1】----減小了系統的一些if/else判斷,所以下降了系統的耦合
中間件能夠實現什麼功能,例如權限驗證,訪問記錄,重定向等等。-----這些業務的存在下降了耦合php
Thinkphp中間件有什麼用?thinkphp
消息隊列、遠程方法調用RPC框架、ODBC、ORM持久化框架、緩存、資源定位、中間件定義的邊界並非很清晰,介於應用邏輯和操做系統(網絡、存儲系統)之間抽象層均可以算做中間件。緩存
thinkphp5.1 中的中間件說明:
生成中間件:網絡
php think make:middleware Check
這個指令會 application/http/middleware目錄下面生成一個Check中間件閉包
1 <?php 2 3 namespace app\http\middleware; 4 5 class Check{ 6 //第三個參數,能夠經過路由賦值傳遞 7 public function handle($request, \Closure $next, $name) 8 { 9 //下面這一句是 給控制器 傳值 10 $request->hello = 'ThinkPHP'; 11 12 if ($name == 'think') { 13 return redirect('index/think'); 14 } 15 16 return $next($request); 17 } 18 19 }
中間件的入口執行方法必須是handle方法,並且第一個參數是Request對象,第二個參數是一個閉包
前置中間件/後置中間件
前置中間件:在請求階段實現,如:判斷登陸狀態,訪問權限等等app
<?php namespace app\http\middleware; class auth{ public function handle($request, \Closure $next) { // 添加中間件執行代碼 return $next($request); }}
後置中間件:請求完成以後實現,如:寫日誌,請求分析等等框架
<?php namespace app\http\middleware; class Log{ public function handle($request, \Closure $next) { $response = $next($request); // 添加中間件執行代碼 return $response; }}
tp5.1中的配置文件:middleware.php【能夠預先註冊中間件,增長別名標識】,若是沒有指定命名空間則默認使用app\http\middlewarethinkphp5
return[ 'check' => app\http\middleware\Check:class, 'auth' => app\http\middleware\Auth:class, 'log' => app\http\middleware\Log:class ]
中間件的使用:【說明當一個方法裏面有多箇中間件【前置中間件】時,執行順序按照 設置中間件使用的配置 的順序執行,後置中間件的執行必定是在請求完成以後,才執行的,因此確定是在最後才被執行】
1、在路由定義配置中設置,如:this
return [ //下面路由註冊的中間件,給中間件auth傳遞了"ahai",給中間件check傳遞了"token"參數,不寫,則不傳遞參數 Route::rule('hello/:name','hello')->middleware(['auth:ahai','check:token','log']), Route::rule('index/:name','think')->middleware('auth') ]
2、在控制器中設置,如:spa
1 <?php 2 namespace app\index\controller; 3 use think\Controller; 4 class Index extends Controller{ 5 6 //這裏配置了中間件,同時限制了中間件的生效操做, 7 //好比下面的auth中間件,使用了except,表示除了hello方法外,這個控制器的其餘的方法都會執行中間件, 8 //check中間件,使用了only表示只有這個控制器的hello方法執行這個中間件 9 //log中間件,沒有使用任何限定參數,表示這個控制器的全部方法都會執行log這個中間件 10 protected $middleware = [ 11 'auth' => ['except' => ['hello'] ], 12 'check' => ['only' => ['hello'] ], 13 'log' 14 ]; 15 16 public function index() 17 { 18 echo request()->auth; 19 echo request()->check; 20 echo request()->log; 21 } 22 public function login() 23 { 24 echo request()->auth; 25 echo request()->check; 26 echo $this->request->log; 27 } 28 public function hello() 29 { 30 echo $this->request->log; 31 echo request()->auth; 32 echo request()->check; 33 } 34 35 }
1 <?php 2 namespace app\http\middleware; 3 class Auth 4 { 5 public function handle($request, \Closure $next) 6 { 7 $request->auth = 'auth'; 8 return $next($request); 9 } 10 } 11 <?php 12 namespace app\http\middleware; 13 class Log 14 { 15 public function handle($request, \Closure $next) 16 { 17 $request->log = 'hello'; 18 return $next($request); 19 } 20 } 21 <?php 22 /** 23 * Created by ahai 24 * Time: 2018/9/27 0027 上午 10:18 25 * Email: <764882431@qq.com> 26 */ 27 namespace app\http\middleware; 28 Class Check 29 { 30 public function handle($request, \Closure $next) 31 { 32 $request->check = 'check'; 33 return $next($request); 34 } 35 }