ThinkPHP6.0之中間件是什么-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)ThinkPHP6.0之中間件是什么的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

我們提供的服務(wù)有:網(wǎng)站制作、成都網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、漳平ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢(xún)和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的漳平網(wǎng)站制作公司

ThinkPHP6.0中間件分為系統(tǒng)中間件和應(yīng)用中間件,系統(tǒng)中間件為核心框架內(nèi)置的中間件,應(yīng)用中間件是在應(yīng)用里面創(chuàng)建的中間件。

中間件的主要應(yīng)用場(chǎng)景可以包括對(duì)HTTP請(qǐng)求的數(shù)據(jù)過(guò)濾、權(quán)限檢測(cè)、請(qǐng)求攔截等行為,使用中間件能夠讓控制器的定義更加簡(jiǎn)單,很多額外的非核心業(yè)務(wù)流程的處理都可以交給中間件執(zhí)行。

從中間件的使用范圍來(lái)看,可以分為全局中間件、應(yīng)用中間件、控制器中間件和路由中間件。

全局中間件

全局中間件是在app\middleware.php中定義的中間件,默認(rèn)沒(méi)有啟用任何中間件,但對(duì)支持的系統(tǒng)中間件做了注釋?zhuān)阒恍枰∠⑨尵涂梢允褂孟鄳?yīng)的系統(tǒng)中間件,默認(rèn)內(nèi)容如下:

return [
    // 全局請(qǐng)求緩存
    // 'think\middleware\CheckRequestCache',
    // 多語(yǔ)言加載
    // 'think\middleware\LoadLangPack',
    // Session初始化
    // 'think\middleware\SessionInit',
    // 頁(yè)面Trace調(diào)試
    // 'think\middleware\TraceDebug',
];

系統(tǒng)的部分功能交給中間件進(jìn)行統(tǒng)一管理,包括全局請(qǐng)求緩存、多語(yǔ)言的自動(dòng)檢測(cè)和加載、Session初始化和頁(yè)面Trace調(diào)試,也就是說(shuō),默認(rèn)安裝后的應(yīng)用是不支持Session的,你必須全局開(kāi)啟Session初始化中間件后Session才能生效。對(duì)于API應(yīng)用來(lái)說(shuō),本身就不需要Session功能支持。

你可以在全局中間件定義文件中添加你的應(yīng)用中間件,但盡可能確保系統(tǒng)中間件的優(yōu)先執(zhí)行,中間件定義需要使用完整的類(lèi)名,通過(guò)命令行指令可以快速創(chuàng)建一個(gè)應(yīng)用中間件:

php think make:middleware Test

會(huì)自動(dòng)生成一個(gè)app\middleware\Test中間件類(lèi),內(nèi)容如下:

<?php
namespace app\middleware;
class Test
{
    public function handle($request, \Closure $next)
    {
    }
}

也支持通過(guò)指定完整命名空間的方式創(chuàng)建中間件類(lèi)

php think make:middleware app\middleware\Hello

我們添加一個(gè)測(cè)試輸出

<?php
namespace app\middleware;
class Test
{
    public function handle($request, \Closure $next)
    {
    echo 'Before Middleware<br/>';
    $response = $next($request);
    echo 'After Middleware<br/>';
    return $response;
    }
}

中間件handle方法的返回值必須是一個(gè)Response對(duì)象。

然后在全局中間件定義中添加

return [
\app\middleware\Test::class,
];

假設(shè)我們要訪問(wèn)的控制器方法為

<?php
namespace app\controller;
class Index
{
    public function hello()
    {
    return 'Hello,ThinkPHP!<br/>';
    }
}

訪問(wèn)該操作方法的輸出為

Before Middleware
Hello,ThinkPHP!
After Middleware

你可以看出中間件的執(zhí)行過(guò)程,從執(zhí)行流程上可以分為前置中間件和后置中間件,當(dāng)然,一個(gè)中間件可能同時(shí)有前置和后置行為,上面的Test中間件就是如此。 $next($request)之前的代碼屬于前置中間件范疇,之后的代碼則屬于后置中間件范疇。

應(yīng)用中間件

如果是多應(yīng)用模式的話(huà),應(yīng)用中間件就是在app\應(yīng)用名\middleware.php中定義的中間件,只會(huì)在該應(yīng)用下有效,定義格式和全局中間件一致。

路由中間件

路由中間件則表示僅在路由匹配之后才會(huì)執(zhí)行某個(gè)中間件,在路由定義中使用middleware方法定義,例如:

Route::get('hello/:name','index/hello')
    ->middleware(\app\middleware\Hello::class);

可以給路由分組定義中間件

Route::group(function(){
Route::get('hello/:name','index/hello');
//...
})->middleware(\app\middleware\Hello::class);

如果要執(zhí)行多個(gè)中間件,可以使用

Route::group(function(){
Route::get('hello/:name','index/hello');
//...
})->middleware([\app\middleware\Hello::class,\app\middleware\Check::class]);

對(duì)于經(jīng)常要使用的中間件,我們可以定義一個(gè)別名,在config\middleware.php配置文件中,設(shè)置

return [
'hello'=>\app\middleware\Hello::class,
'check'=>\app\middleware\Check::class,
];

路由定義可以改為:

Route::group(function(){
Route::get('hello/:name','index/hello');
//...
})->middleware(['hello','check']);

支持給一組中間件定義別名

return [
'test'=>[\app\middleware\Hello::class,\app\middleware\Check::class],
];

路由定義可以改為

Route::group(function(){
Route::get('hello/:name','index/hello');
//...
})->middleware('test');

中間件支持傳入一個(gè)參數(shù),中間件定義如下:

<?php
namespace app\middleware;
class Hello
{
    public function handle($request, \Closure $next, string $name = '')
    {
    echo 'Hello'. $name . '<br/>';
    return $next($request);
    }
}

可以在路由中間件的第二個(gè)參數(shù)傳入name參數(shù)

Route::get('hello/:name','index/hello')
    ->middleware('hello', 'middleware');

除了支持參數(shù)外,你可以在中間件的handle方法中使用依賴(lài)注入。

控制器中間件

控制器中間件僅當(dāng)訪問(wèn)某個(gè)控制器的時(shí)候生效

<?php
namespace app\controller;
class Hello
{
protected $middleware = ['hello','check'];
    public function index()
    {
    return 'Hello,ThinkPHP!<br/>';
    }
}

由于前面已經(jīng)定義了中間件別名,所以這里直接使用別名定義,否則你必須使用完整的命名空間定義。

默認(rèn)情況下,控制器中定義的中間件訪問(wèn)控制器的任何操作方法都會(huì)執(zhí)行,有時(shí)候并不希望所有的操作都需要執(zhí)行中間件,有兩種方式來(lái)定義控制器中間件的執(zhí)行過(guò)濾。

<?php
namespace app\controller;
class Index
{
protected $middleware = [
'hello' => ['only'  => ['hello']],
'check' => ['except'=> ['hello']],
];
    public function hello()
    {
    return 'Hello,ThinkPHP!<br/>';
    }
    public function check()
    {
    return 'this action require check!<br/>';
    }    
}

hello中間件僅在執(zhí)行Index控制器的hello操作的時(shí)候才會(huì)執(zhí)行,而check中間件除了hello方法外,都會(huì)執(zhí)行,具體效果你可以實(shí)際測(cè)試下。

中間件傳參

中間件和控制器之間傳參的方式有很多,一個(gè)簡(jiǎn)單的方法是使用Request來(lái)進(jìn)行傳參。

<?php
namespace app\middleware;
class Hello
{
    public function handle($request, \Closure $next)
    {
        $request->hello = 'ThinkPHP';
        
        return $next($request);
    }
}

中間件向控制器傳參必須在前置中間件完成,后置中間件向控制器的傳參控制器無(wú)法接收。

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

public function index(Request $request)
{
return $request->hello; // ThinkPHP
}

感謝各位的閱讀!關(guān)于“ThinkPHP6.0之中間件是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

分享題目:ThinkPHP6.0之中間件是什么-創(chuàng)新互聯(lián)
瀏覽地址:http://bm7419.com/article44/dicgee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、響應(yīng)式網(wǎng)站小程序開(kāi)發(fā)、定制網(wǎng)站、云服務(wù)器網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化