thinkphp中間件是什麼意思
從5.1.6 版本開始,正式引入中間件的支援。
中間件主要用於攔截或過濾應用的HTTP請求,並進行必要的業務處理。
定義中間件
可以透過命令列指令快速產生中間件
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') == 'think') { return redirect('index/think'); } return $next($request); } }
中間件的入口執行方法必須是handle方法,而且第一個參數是Request對象,第二個參數是一個閉包。
中間件handle方法的回傳值必須是一個Response物件。
在這個中間件中我們判斷目前請求的name參數等於think的時候進行重定向處理。否則,請求將進一步傳遞到應用程式中。要讓請求繼續傳遞到應用程式中,只需使用 $request 作為參數去呼叫回調函數 $next 。
在某些需求下,可以使用第三個參數傳入額外的參數。
<?php namespace app\http\middleware; class Check { public function handle($request, \Closure $next, $name) { if ($name == 'think') { return redirect('index/think'); } return $next($request); } }
前置/後置中間件
中間件是在請求特定的操作之前還是之後執行,完全取決於中間件的定義本身。
下面是一個前置行為的中間件
<?php namespace app\http\middleware; class Before { public function handle($request, \Closure $next) { // 添加中间件执行代码 return $next($request); } }
下面是一個後置行為的中間件
<?php namespace app\http\middleware; class After { public function handle($request, \Closure $next) { $response = $next($request); // 添加中间件执行代码 return $response; } }
來個比較實際的例子,我們需要判斷當前瀏覽器環境是在微信或支付寶
namespace app\http\middleware; /** * 访问环境检查,是否是微信或支付宝等 */ class InAppCheck { public function handle($request, \Closure $next) { if (preg_match('~micromessenger~i', $request->header('user-agent'))) { $request->InApp = 'WeChat'; } else if (preg_match('~alipay~i', $request->header('user-agent'))) { $request->InApp = 'Alipay'; } return $next($request); } }
然後在你的行動版的module裡加入一個middleware.php檔案
例如:/path/application/mobile/middleware.php
return [ app\http\middleware\InAppCheck::class, ];
然後在你的controller中可以透過$this->request->InApp取得相關的值
註冊中間件
路由中間件
最常用的中間件註冊方式是註冊路由中間件
Route::rule('hello/:name','hello') ->middleware('Auth');
或使用完整的中間件類別名稱
Route::rule('hello/:name','hello') ->middleware(app\http\middleware\Auth::class);
支援註冊多個中介軟體
Route::rule('hello/:name','hello') ->middleware(['Auth', 'Check']);
V5.1.7 版本,可以直接在應用程式設定目錄下的middleware.php中先預先定義中間件(其實就是增加別名識別),例如:
return [ 'auth'=>app\http\middleware\Auth::class, 'check'=>app\http\middleware\Check::class ];
然後直接在路由中使用中間件別名註冊
Route::rule('hello/:name','hello') ->middleware(['Auth', 'Check']);
V5.1.8 版本開始,可以支援使用別名定義一組中間件,例如:
return [ 'check'=>[ app\http\middleware\Auth::class, app\http\middleware\Check::class ], ];
然後,直接使用下面的方式註冊中間件
Route::rule('hello/:name','hello') ->middleware('check');
支援對路由分組註冊中間件
Route::group('hello', function(){ Route::rule('hello/:name','hello'); })->middleware('Auth');
V5.1.8 版本開始支援對某個網域註冊中間件
Route::domain('admin', function(){ // 注册域名下的路由规则 })->middleware('Auth');
如果需要傳入額外參數給中間件,可以使用
Route::rule('hello/:name','hello') ->middleware('Auth:admin');
如果使用的是常數方式定義,可以在第二個參數傳入中間件參數。
Route::rule('hello/:name','hello') ->middleware(Auth::class, 'admin');
如果需要定義多個中間件,使用陣列方式
Route::rule('hello/:name','hello') ->middleware([Auth::class, 'Check']);
可以統一傳入同一個額外參數
Route::rule('hello/:name','hello') ->middleware([Auth::class, 'Check'], 'admin');
或單獨指定中間件參數。
Route::rule('hello/:name','hello') ->middleware(['Auth:admin', 'Check:editor']);
使用閉包定義中間件
你不一定要使用中間件類,在某些簡單的場合你可以使用閉包定義中間件,但閉包函數必須傳回Response物件實例。
Route::group('hello', function(){ Route::rule('hello/:name','hello'); })->middleware(function($request,\Closure $next){ if ($request->param('name') == 'think') { return redirect('index/think'); } return $next($request); });
全域中間件
你可以在應用程式目錄下方定義middleware.php文件,使用下面的方式:
<?php return [ \app\http\middleware\Auth::class, 'Check', 'Hello', ];
中間件的註冊應該使用完整的類別名,如果沒有指定命名空間則使用app\http\middleware作為命名空間。
全域中間件的執行順序就是定義順序。可以在定義全域中間件的時候傳入中間件參數,支援兩種方式傳入。
<?php return [ [\app\http\middleware\Auth::class, 'admin'], 'Check', 'Hello:thinkphp', ];
上面的定義表示 給Auth中間件傳入admin參數,給Hello中間件傳入thinkphp參數。
模組中間件
V5.1.8 版本開始,支援模組中間件定義,你可以直接在模組目錄下方增加middleware.php文件,定義方式和應用中間件定義一樣,只是只會在這個模組下面生效。
控制器中間件
V5.1.17 版本開始,支援為控制器定義中間件。首先你的控制器需要繼承系統的think\Controller類,然後在控制器中定義middleware屬性,例如:
<?php namespace app\index\controller; use think\Controller; class Index extends Controller { protected $middleware = ['Auth']; public function index() { return 'index'; } public function hello() { return 'hello'; } }
當執行index控制器的時候就會呼叫Auth中間件,一樣支援使用完整的命名空間定義。
如果需要設定控制器中間的生效操作,可以如下定義:
<?php namespace app\index\controller; use think\Controller; class Index extends Controller { protected $middleware = [ 'Auth' => ['except' => ['hello'] ], 'Hello' => ['only' => ['hello'] ], ]; public function index() { return 'index'; } public function hello() { return 'hello'; } }
中間件向控制器傳參
可以透過給予請求物件賦值的方式傳參給控制器(或其它地方),例如
<?php namespace app\http\middleware; class Hello { public function handle($request, \Closure $next) { $request->hello = 'ThinkPHP'; return $next($request); } }
注意,傳遞的變數名稱不要和param變數有衝突。
然後在控制器的方法裡面可以直接使用
public function index(Request $request) { return $request->hello; // ThinkPHP }
本文來自ThinkPHP框架技術文章欄位:http://www.php.cn/phpkj/thinkphp/
以上是thinkphp中間件是什麼意思的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

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

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

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

Dreamweaver CS6
視覺化網頁開發工具

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

熱門話題

執行 ThinkPHP 專案需要:安裝 Composer;使用 Composer 建立專案;進入專案目錄,執行 php bin/console serve;造訪 http://localhost:8000 查看歡迎頁面。

ThinkPHP 擁有多個版本,針對不同 PHP 版本而設計。主要版本包括 3.2、5.0、5.1 和 6.0,而次要版本用於修復 bug 和提供新功能。目前最新穩定版本為 ThinkPHP 6.0.16。在選擇版本時,需考慮 PHP 版本、功能需求和社群支援。建議使用最新穩定版本以獲得最佳性能和支援。

ThinkPHP Framework 的本機運作步驟:下載並解壓縮 ThinkPHP Framework 到本機目錄。建立虛擬主機(可選),指向 ThinkPHP 根目錄。配置資料庫連線參數。啟動 Web 伺服器。初始化 ThinkPHP 應用程式。存取 ThinkPHP 應用程式 URL 運行。

Laravel 和 ThinkPHP 框架的效能比較:ThinkPHP 效能通常優於 Laravel,專注於最佳化和快取。 Laravel 性能良好,但對於複雜應用程序,ThinkPHP 可能更適合。

《開發建議:如何利用ThinkPHP框架實現非同步任務》隨著網路技術的快速發展,Web應用程式對於處理大量並發請求和複雜業務邏輯的需求也越來越高。為了提高系統的效能和使用者體驗,開發人員常常會考慮利用非同步任務來執行一些耗時操作,例如發送郵件、處理文件上傳、產生報表等。在PHP領域,ThinkPHP框架作為一個流行的開發框架,提供了一些便捷的方式來實現非同步任務。

ThinkPHP 安裝步驟:準備 PHP、Composer、MySQL 環境。使用 Composer 建立專案。安裝 ThinkPHP 框架及相依性。配置資料庫連線。產生應用程式碼。啟動應用程式並造訪 http://localhost:8000。

ThinkPHP 是一款高效能的 PHP 框架,具備快取機制、程式碼最佳化、平行處理和資料庫最佳化等優勢。官方性能測試顯示,它每秒可處理超過 10,000 個請求,實際應用中被廣泛用於京東商城、攜程網等大型網站和企業系統。

基於ThinkPHP6和Swoole的RPC服務實作檔案傳輸功能引言:隨著網路的發展,檔案傳輸在我們的日常工作中變得越來越重要。為了提高檔案傳輸的效率和安全性,本文將介紹基於ThinkPHP6和Swoole的RPC服務實作檔案傳輸功能的具體實作方法。我們將使用ThinkPHP6作為Web框架,利用Swoole的RPC功能來實現跨伺服器的檔案傳輸。一、環境準
