日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務,提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

本篇文章給大家?guī)砹岁P于thinkphp的相關知識,其中主要介紹了關于中間件的用法,包括了什么是前置中間件、后置中間件,還有路由中間件、全局中間件等等相關內(nèi)容,下面一起來看一下,希望對大家有幫助。

Thinkphp5.1詳細講解中間件的用法

一、中間件的作用

中間件主要用于攔截或過濾應用的HTTP請求,并進行必要的業(yè)務處理。比如可以使用中間件來檢查用戶的請求信息里是否包含一句話木馬。

行為鉤子和中間件的區(qū)別:

中間件:它是對項目請求做處理,在用戶訪問我們的項目時,中間件就可以對于這個請求來判斷用戶是否有權限,或者判斷用戶是否存在非法訪問;

行為鉤子:在某一動作開始或者結(jié)束的時候會觸發(fā)的方法,比如用戶注冊成功記錄日志;

中間件是對用戶請求做處理,而鉤子則是對用戶動作的處理,中間件相當于過濾器,鉤子相當于事件,都是采用AOP思想。

二、定義中間件

首先,可以通過cmd命令行指令快速生成中間件,在項目的根目錄里執(zhí)行以下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、中間件的入口執(zhí)行方法必須是handle方法,而且第一個參數(shù)是Request對象,第二個參數(shù)是一個閉包;

2、中間件handle方法的返回值必須是一個Response對象;

3、中間件里可以直接使用Request對象,獲取請求參數(shù);

4、在某些需求下,可以使用第三個參數(shù)傳入額外的參數(shù);

public function handle($request, \Closure $next, $name){
    if ($name == 'index') {
        return redirect('/');//重定向到首頁
    }
 
    return $next($request);
}


1、前置中間件

前置中間件的意思就是,在http請求完成之前,先執(zhí)行中間件的代碼。

<?php
 
namespace app\http\middleware;
 
class Before
{
    public function handle($request, \Closure $next)
    {
        // 先執(zhí)行中間件代碼
        return $next($request);
    }
}

2、后置中間件

后置中間件的意思就是,在http請求完成之后,才開始執(zhí)行中間件的代碼。

<?php
 
namespace app\http\middleware;
 
class After
{
    public function handle($request, \Closure $next)
    {
        $response = $next($request);
        //后執(zhí)行中間件代碼
        return $response;
    }
}


三、注冊中間件

1、路由中間件

顧名思義,就是指定在某個路由下才會去調(diào)用這個中間件,即用戶訪問了這個路由鏈接,就會執(zhí)行這個中間件。

//用戶登錄的路由
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');


2、全局中間件

意思就是說,所有的(全局)http訪問請求,都會自動調(diào)用這個中間件。

在application目錄下創(chuàng)建middleware.php文件,代碼如下:

<?php
return [
    //第1個中間件
    \app\http\middleware\Auth::class,
    //第2個中間件(Check中間件沒有指定命名空間,所以會默認使用app\http\middleware作為命名空間)
    'Check',
];


3、模塊中間件

Thinkphp5.1.8+版本以上支持模塊中間件定義,你可以直接在模塊目錄下面增加middleware.php文件,定義方式和全局中間件定義一樣,只是只會在該模塊下面生效。


4、控制器中間件

Thinkphp5.1.17+版本以上支持為控制器定義中間件。首先你的控制器需要繼承系統(tǒng)的think\Controller類,然后在控制器中定義middleware屬性,例如:

<?php
namespace app\index\controller;
use think\Controller;
 
class Index extends Controller{
 
    protected $middleware = ['Auth'];
 
    public function index()
    {
        return 'index';
    }
}


5、使用閉包定義中間件

在某些簡單的場合,我們不需要使用中間件類,這時候可以使用閉包定義中間件,但閉包函數(shù)必須返回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);
});


四、給中間件傳入?yún)?shù)

1、全局中間件傳參數(shù)

<?php
return [
    [\app\http\middleware\Auth::class, '張三'],
    'Check:李四',
];

上面的定義表示給Auth中間件傳入?yún)?shù)為張三,給Check中間件傳入?yún)?shù)為李四


2、路由中間件傳參數(shù)

(1)、給Auth中間件傳入?yún)?shù)張三

Route::rule('login','index/User/login')->middleware('Auth:張三');

也可以這樣寫:

Route::rule('login','index/User/login')->middleware(Auth::class, '張三');

(2)、給多個中間件傳入同一個參數(shù)

Route::rule('login','index/user/login')->middleware(['Auth:張三', 'Check:李四']);


五、中間件向控制器傳參數(shù)

前面講的給中間件傳入特定的參數(shù) (常量),那么中間要如何向控制器傳入?yún)?shù)呢?我們可以通過給Request請求對象賦值的方式傳參給控制器(或者其它地方),例如:

<?php
namespace app\http\middleware;
 
class Auth
{
    public function handle($request, \Closure $next)
    {
        //給控制器傳參數(shù)
        $request->result = '驗證成功';       
        return $next($request);
    }
}

需要特別注意:傳遞的變量名稱不要和Request已有的參數(shù)變量名有沖突,比如用戶登錄請求的Request參數(shù)里已經(jīng)有一個username,那么中間件向控制器傳參,就不能再用這個username了,否則會改變原來參數(shù)的值。


然后在控制器的方法里面可以直接使用:

public function index(Request $request)
{
    return $request->result;
}


分享到:
標簽:Thinkphp5.1 中間件的用法
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定