一文了解ThinkPHP6.0之中間件
ThinkPHP6.0中介軟體分為系統中介軟體和應用中介軟體,系統中介軟體為核心框架內建的中間件,應用中間件是在應用裡面建立的中間件。
中間件的主要應用場景可以包括對HTTP請求的資料過濾、權限偵測、請求攔截等行為,使用中間件能夠讓控制器的定義更加簡單,許多額外的非核心業務流程的處理都可以交給中間件執行。
從中間件的使用範圍來看,可以分為全域中間件、應用中間件、控制器中間件和路由中間件。
全域中間件
全域中間件是在app\middleware.php中定義的中間件,預設沒有啟用任何中間件,但對支援的系統中間件做了註釋,你只需要取消註釋就可以使用對應的系統中間件,預設內容如下:
return [ // 全局请求缓存 // 'think\middleware\CheckRequestCache', // 多语言加载 // 'think\middleware\LoadLangPack', // Session初始化 // 'think\middleware\SessionInit', // 页面Trace调试 // 'think\middleware\TraceDebug', ];
系統的部分功能交給中間件進行統一管理,包括全域請求快取、多語言的自動偵測與載入、Session初始化和頁面Trace調試,也就是說,預設安裝後的應用是不支援Session的,你必須全域開啟Session初始化中間件後Session才能生效。對於API應用程式來說,本身就不需要Session功能支援。
你可以在全域中間件定義檔中加入你的應用程式中間件,但盡可能確保系統中介軟體的優先執行,中間件定義需要使用完整的類別名,透過命令列指令可以快速創建一個應用中間件:
php think make:middleware Test
會自動產生一個app\middleware\Test中間件類,內容如下:
<?php namespace app\middleware; class Test { public function handle($request, \Closure $next) { } }
也支援透過指定完整命名空間的方式建立中間件類別
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
你可以看出中間件的執行過程,從執行流程上可以分為前置中間件和後置中間件,當然,一個中間件可能同時有前置和後置行為,上面的Test中間件就是如此。 $next($request)之前的程式碼屬於前置中介軟體範疇,之後的程式碼則屬於後置中間件範疇。
應用中間件
如果是多應用模式的話,應用中間件就是在app\套用名稱\middleware.php中定義的中間件,只會在該應用下有效,定義格式和全域中間件一致。
路由中間件
路由中間件則表示僅在路由匹配之後才會執行某個中間件,在路由定義中使用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);
如果要執行多個中間件,可以使用
Route::group(function(){ Route::get('hello/:name','index/hello'); //... })->middleware([\app\middleware\Hello::class,\app\middleware\Check::class]);
對於經常要使用的中間件,我們可以定義一個別名,在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');
中間件支援傳入一個參數,中間件定義如下:
<?php namespace app\middleware; class Hello { public function handle($request, \Closure $next, string $name = '') { echo 'Hello'. $name . '<br/>'; return $next($request); } }
可以在路由中間件的第二個參數傳入name參數
Route::get('hello/:name','index/hello') ->middleware('hello', 'middleware');
除了支援參數外,你可以在中間件的handle方法中使用依賴注入。
控制器中間件
控制器中間件僅當存取某個控制器的時候生效
<?php namespace app\controller; class Hello { protected $middleware = ['hello','check']; public function index() { return 'Hello,ThinkPHP!<br/>'; } }
由於前面已經定義了中間件別名,所以這裡直接使用別名定義,否則你必須使用完整的命名空間定義。
預設情況下,控制器中定義的中間件存取控制器的任何操作方法都會執行,有時並不希望所有的操作都需要執行中間件,有兩種方式來定義控制器中間件的執行過濾。
<?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中間件僅在執行Index控制器的hello操作的時候才會執行,而check中間件除了hello方法外,都會執行,具體效果你可以實際測試下。
中間件傳參
中間件和控制器之間傳參的方式有很多,一個簡單的方法是使用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 }
眾多ThinkPHP教程視頻,盡在PHP中文網,歡迎在線學習!
本文轉自:https://www.php.cn/phpkj/thinkphp/
以上是一文了解ThinkPHP6.0之中間件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

如何在CodeIgniter中實現自訂中間件引言:在現代的Web開發中,中間件在應用程式中起著至關重要的作用。它們可以用來執行在請求到達控制器之前或之後執行一些共享的處理邏輯。 CodeIgniter作為一個流行的PHP框架,也支持中間件的使用。本文將介紹如何在CodeIgniter中實作自訂中間件,並提供一個簡單的程式碼範例。中間件概述:中間件是一種在請求

使用Slim框架中的中間件實現用戶身份驗證隨著網路應用程式的發展,用戶身份驗證成為了至關重要的功能。為了保護用戶的個人資訊和敏感數據,我們需要一種可靠的方法來驗證用戶的身份。在本文中,我們將介紹如何使用Slim框架的中間件來實現使用者驗證。 Slim框架是一個輕量級的PHP框架,它提供了一種簡單、快速的方式來建立網路應用程式。其中一個強大的特性是中間

tomcat中間件原理是基於Java Servlet和Java EE規格來實現的。 Tomcat作為Servlet容器,負責處理HTTP請求和回應,提供Web應用程式的運作環境。 Tomcat中間件的原理主要涉及:1、容器模型;2、元件化架構;3、Servlet處理機制;4、事件監聽和過濾器;5、組態管理;6、安全性;7、叢集和負載平衡; 8、連接器技術;9、嵌入式模式等等。

如何在Laravel中使用中間件處理表單驗證,需要具體程式碼範例引言:在Laravel中,表單驗證是非常常見的任務。為了確保使用者輸入的資料的有效性和安全性,我們通常會對表單提交的資料進行驗證。 Laravel提供了一個方便的表單驗證功能,同時也支援使用中間件來處理表單驗證。本文將詳細介紹如何在Laravel中使用中間件處理表單驗證,並提供具體的程式碼範例

如何在Laravel中使用中間件進行資料加速引言:在使用Laravel框架開發Web應用程式時,資料加速是提高應用程式效能的關鍵。中間件是Laravel提供的重要功能,可以在請求到達控制器之前或回應返回之前對請求進行處理。本文將重點放在如何在Laravel中使用中間件實現資料加速,並提供具體的程式碼範例。一、什麼是中間件中間件是Laravel框架中一種機制,用

如何在Laravel中使用中間件進行回應轉換中間件是Laravel框架中非常強大且實用的功能之一。它允許我們在請求進入控制器之前或回應被發送給客戶端之前,對請求和回應進行處理。在本文中,我將示範如何使用中間件在Laravel中進行回應轉換。在開始之前,確保你已經安裝了Laravel並創建了一個新的專案。現在,我們將按照以下步驟進行操作:建立一個新的中間件打開

在Slim框架中使用中間件(Middleware)設定跨域資源共享(CORS)的方法跨域資源共享(CORS)是一種機制,允許伺服器在HTTP響應頭中設定一些額外的信息,來告知瀏覽器是否允許跨域請求。在一些前後端分離的專案中,使用CORS機制可以實現前端跨域請求後端介面的需求。在使用Slim框架開發RESTAPI時,我們可以使用中間件(Middleware)

Laravel是一個流行的PHPWeb應用程式框架,提供了許多快速且簡單的方式來建立高效、安全且可擴展的Web應用程式。在開發Laravel應用程式時,我們經常需要考慮資料恢復的問題,即如何在資料遺失或損壞的情況下恢復資料並保證應用程式的正常運作。在本文中,我們將介紹如何使用Laravel中間件來實現資料復原功能,並提供具體的程式碼範例。一、什麼是Lara
