Thinkphp6.0中間件的具體使用
6.0中間件分為系統(tǒng)中間件和應用中間件,系統(tǒng)中間件為核心框架內(nèi)置的中間件,應用中間件是在應用里面創(chuàng)建的中間件。
中間件的主要應用場景可以包括對HTTP請求的數(shù)據(jù)過濾、權限檢測、請求攔截等行為,使用中間件能夠讓控制器的定義更加簡單,很多額外的非核心業(yè)務流程的處理都可以交給中間件執(zhí)行。
從中間件的使用范圍來看,可以分為全局中間件、應用中間件、控制器中間件和路由中間件。
全局中間件
全局中間件是在app\middleware.php中定義的中間件,默認沒有啟用任何中間件,但對支持的系統(tǒng)中間件做了注釋,你只需要取消注釋就可以使用相應的系統(tǒng)中間件,默認內(nèi)容如下:
return [
// 全局請求緩存
// 'think\middleware\CheckRequestCache',
// 多語言加載
// 'think\middleware\LoadLangPack',
// Session初始化
// 'think\middleware\SessionInit',
// 頁面Trace調(diào)試
// 'think\middleware\TraceDebug',
];
系統(tǒng)的部分功能交給中間件進行統(tǒng)一管理,包括全局請求緩存、多語言的自動檢測和加載、Session初始化和頁面Trace調(diào)試,也就是說,默認安裝后的應用是不支持Session的,你必須全局開啟Session初始化中間件后Session才能生效。對于API應用來說,本身就不需要Session功能支持。
你可以在全局中間件定義文件中添加你的應用中間件,但盡可能確保系統(tǒng)中間件的優(yōu)先執(zhí)行,中間件定義需要使用完整的類名,通過命令行指令可以快速創(chuàng)建一個應用中間件:
php think make:middleware Test
會自動生成一個app\middleware\Test中間件類,內(nèi)容如下:
<?php
namespace app\middleware;
class Test
{
public function handle($request, \Closure $next)
{
}
}
也支持通過指定完整命名空間的方式創(chuàng)建中間件類
php think make:middleware app\middleware\Hello
我們添加一個測試輸出
<?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方法的返回值必須是一個Response對象。
然后在全局中間件定義中添加
return [ \app\middleware\Test::class, ];
假設我們要訪問的控制器方法為
<?php
namespace app\controller;
class Index
{
public function hello()
{
return 'Hello,ThinkPHP!<br/>';
}
}
訪問該操作方法的輸出為
Before Middleware
Hello,ThinkPHP!
After Middleware
你可以看出中間件的執(zhí)行過程,從執(zhí)行流程上可以分為前置中間件和后置中間件,當然,一個中間件可能同時有前置和后置行為,上面的Test中間件就是如此。 $next($request)之前的代碼屬于前置中間件范疇,之后的代碼則屬于后置中間件范疇。
應用中間件
如果是多應用模式的話,應用中間件就是在app\應用名\middleware.php中定義的中間件,只會在該應用下有效,定義格式和全局中間件一致。
路由中間件
路由中間件則表示僅在路由匹配之后才會執(zhí)行某個中間件,在路由定義中使用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í)行多個中間件,可以使用
Route::group(function(){
Route::get('hello/:name','index/hello');
//...
})->middleware([\app\middleware\Hello::class,\app\middleware\Check::class]);
對于經(jīng)常要使用的中間件,我們可以定義一個別名,在config\middleware.php配置文件中,設置
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');
中間件支持傳入一個參數(shù),中間件定義如下
<?php
namespace app\middleware;
class Hello
{
public function handle($request, \Closure $next, string $name = '')
{
echo 'Hello'. $name . '<br/>';
return $next($request);
}
}
可以在路由中間件的第二個參數(shù)傳入name參數(shù)
Route::get('hello/:name','index/hello')
->middleware('hello', 'middleware');
除了支持參數(shù)外,你可以在中間件的handle方法中使用依賴注入。
控制器中間件
控制器中間件僅當訪問某個控制器的時候生效
<?php
namespace app\controller;
class Hello
{
protected $middleware = ['hello','check'];
public function index()
{
return 'Hello,ThinkPHP!<br/>';
}
}
由于前面已經(jīng)定義了中間件別名,所以這里直接使用別名定義,否則你必須使用完整的命名空間定義。
默認情況下,控制器中定義的中間件訪問控制器的任何操作方法都會執(zhí)行,有時候并不希望所有的操作都需要執(zhí)行中間件,有兩種方式來定義控制器中間件的執(zhí)行過濾。
<?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操作的時候才會執(zhí)行,而check中間件除了hello方法外,都會執(zhí)行,具體效果你可以實際測試下。
中間件傳參
中間件和控制器之間傳參的方式有很多,一個簡單的方法是使用Request來進行傳參。
<?php
namespace app\middleware;
class Hello
{
public function handle($request, \Closure $next)
{
$request->hello = 'ThinkPHP';
return $next($request);
}
}
中間件向控制器傳參必須在前置中間件完成,后置中間件向控制器的傳參控制器無法接收。
然后在控制器的方法里面可以直接使用
public function index(Request $request)
{
return $request->hello; // ThinkPHP
}
到此這篇關于Thinkphp6.0中間件的具體使用的文章就介紹到這了,更多相關Thinkphp6.0中間件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- thinkphp6中Redis 的基本使用方法詳解
- ThinkPHP6.0前置、后置中間件區(qū)別
- thinkphp6使用mysql悲觀鎖解決商品超賣問題的實現(xiàn)
- ThinkPHP6通過Ucenter實現(xiàn)注冊登錄的示例代碼
- ThinkPHP6.0如何利用自定義驗證規(guī)則規(guī)范的實現(xiàn)登陸
- 基于thinkphp6.0的success、error實現(xiàn)方法
- 使用composer安裝使用thinkphp6.0框架問題【視頻教程】
- windows?server?2012?r2?服務器部署tp6?項目
- ThinkPHP5中如何使用redis
- 寶塔中ThinkPHP框架使用Redis的一系列教程
- ThinkPHP自定義Redis處理SESSION的實現(xiàn)方法
- Thinkphp6 配置并使用redis圖文詳解
相關文章
php getcwd與dirname(__FILE__)區(qū)別詳解
這篇文章主要介紹了php getcwd與dirname(__FILE__)區(qū)別詳解的相關資料,需要的朋友可以參考下2016-09-09
對于ThinkPHP框架早期版本的一個SQL注入漏洞詳細分析
這篇文章主要介紹了對于ThinkPHP框架早期版本的一個SQL注入漏洞詳細分析,對于網(wǎng)站安全十分重要!需要的朋友可以參考下2014-07-07
Centos下升級php5.2到php5.4全記錄(編譯安裝)
這篇文章主要介紹了Centos下升級php5.2到php5.4全記錄(編譯安裝),本文還同時講解了解決htmlspecialchars默認編碼UTF-8問題的解決方法,需要的朋友可以參考下2015-04-04
ThinkPHP3.1新特性之動態(tài)設置自動完成及自動驗證示例代碼
這篇文章主要介紹了ThinkPHP3.1的動態(tài)設置自動完成及自動驗證功能,需要的朋友可以參考下2014-06-06

