thinkphp5.1 中間件是什麼,有什麼用

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

中間件主要用於攔截或過濾應用的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 }
複製代碼
相關文章
相關標籤/搜索