thinkphp5.1 中間件的理解和整理

中間件是什麼?有什麼作用?

中間件主要用於攔截或過濾應用的HTTP請求,並進行必要的業務處理。---tp5.1手冊

也就是說,降低了系統的耦合;【在http請求階段,執行中間件的入口執行方法(handle)--tp5.1】----減少了系統的一些if/else判斷,因此降低了系統的耦合

中間件可以實現什麼功能,例如權限驗證,訪問記錄,重定向等等。-----這些業務的存在降低了耦合

thinkphp5.1 中的中間件說明:
生成中間件:

  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對象,第二個參數是一個閉包

前置中間件/後置中間件

前置中間件:在請求階段實現,如:判斷登錄狀態,訪問權限等等

  1. <?php
  2.  
  3. namespace app\http\middleware;
  4. class auth{
  5.     public function handle($request, \Closure $next)
  6.     {
  7.         // 添加中間件執行代碼
  8.  
  9.         return $next($request);
  10.     }}

複製代碼

 

後置中間件:請求完成之後實現,如:寫日誌,請求分析等等

  1. <?php
  2.  
  3. namespace app\http\middleware;
  4.  
  5. class Log{
  6.     public function handle($request, \Closure $next)
  7.     {
  8.         $response = $next($request);
  9.  
  10.         // 添加中間件執行代碼
  11.  
  12.         return $response;
  13.     }}

複製代碼

 

tp5.1中的配置文件:middleware.php【可以預先註冊中間件,增加別名標識】,如果沒有指定命名空間則默認使用app\http\middleware

  1. return[
  2.  
  3.     'check' => app\http\middleware\Check:class,
  4.     'auth' => app\http\middleware\Auth:class,
  5.     'log' => app\http\middleware\Log:class
  6.  
  7. ]

複製代碼

 

中間件的使用:【說明當一個方法裏面有多箇中間件【前置中間件】時,執行順序按照 設置中間件使用的配置 的順序執行,後置中間件的執行一定是在請求完成之後,才執行的,所以肯定是在最後才被執行】

一、在路由定義配置中設置,如:

  1. return [
  2.  
  3. //下面路由註冊的中間件,給中間件auth傳遞了"ahai",給中間件check傳遞了"token"參數,不寫,則不傳遞參數
  4. Route::rule('hello/:name','hello')->middleware(['auth:ahai','check:token','log']),
  5. Route::rule('index/:name','think')->middleware('auth')
  6. ]

複製代碼

 

二、在控制器中設置,如:

  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.  
  29.     public function hello()
  30.     {
  31.         echo $this->request->log;
  32.         echo request()->auth;
  33.         echo request()->check;
  34.     }
  35.      
  36.     }

複製代碼

 

  1. <?php
  2.  
  3. namespace app\http\middleware;
  4.  
  5. class Auth
  6. {
  7.     public function handle($request, \Closure $next)
  8.     {
  9.         $request->auth = 'auth';
  10.         return $next($request);
  11.     }
  12. }
  13. <?php
  14. namespace app\http\middleware;
  15.  
  16. class Log
  17. {
  18.     public function handle($request, \Closure $next)
  19.     {
  20.          $request->log = 'hello';
  21.          return $next($request);
  22.     }
  23. }
  24. <?php
  25. /**
  26.  * Created by ahai
  27.  * Time: 2018/9/27 0027 上午 10:18
  28.  * Email: <[email protected]>
  29.  */
  30. namespace app\http\middleware;
  31.  
  32. Class Check
  33. {
  34.     public function handle($request, \Closure $next)
  35.     {
  36.         $request->check = 'check';
  37.         return $next($request);
  38.     }
  39. }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章