>[danger] 官方已經(jīng)在前不久發(fā)布了ThinkPHP`5.1.7`版本,`5.1`版本相較于`5.0`版本而言,本身更加嚴(yán)謹(jǐn)和規(guī)范,更接近主流設(shè)計(jì)思想。近半年來(lái),`5.1`版本更新頻繁,此次最新版本更是帶來(lái)了很多的新特性。正在或者打算使用`5.1`版本的朋友可以關(guān)注下了,因?yàn)榻?jīng)過(guò)此次更新后,`5.1`版本也進(jìn)入穩(wěn)定階段了,基本上不太會(huì)有大的調(diào)整了。
最新版本(`V5.1.7`)的主要新特性主要包含:
[TOC=2,2]
## 引入中間件支持
關(guān)于中間件想必很多開(kāi)發(fā)者已經(jīng)在其它的主流框架中了解到了,ThinkPHP`5.1`版本最開(kāi)始沒(méi)有引入中間件的原因是考慮到用戶需要了解新的知識(shí)概念和用法,同時(shí)容易和原來(lái)的行為用法相混淆。
>[info] 為了更規(guī)范開(kāi)發(fā)和最大程度的公用某些組件,新版正式引入中間件支持。
原來(lái)你可能需要在控制器的初始化方法中添加相類似的代碼,現(xiàn)在你可以把這些代碼從控制器中獨(dú)立出來(lái),方便更多的模塊調(diào)用和重用。如果你原來(lái)使用的是行為來(lái)進(jìn)行處理的話,那么是否決定也改為中間件完全取決于你自己,因?yàn)槿匀豢梢约嫒葸\(yùn)行(至少在`5.1`版本中不會(huì)變化)。
中間件的基本用法我大概介紹下:
### 定義中間件
可以通過(guò)命令行指令快速生成中間件類
~~~
php think make:middleware Check
~~~
這個(gè)指令會(huì) `application/http/middleware`目錄下面生成一個(gè)`Check`中間件,也就是說(shuō)默認(rèn)生成的中間件的命名空間都是`app\http\middleware`,這個(gè)必須注意。
~~~
<?php
namespace app\http\middleware;
class Check
{
public function handle($request, \Closure $next)
{
}
}
~~~
中間件的入口執(zhí)行方法必須是`handle`方法,而且第一個(gè)參數(shù)是`Request`對(duì)象,第二個(gè)參數(shù)是一個(gè)閉包。
>[danger] 中間件`handle`方法的返回值必須是一個(gè)`Response`對(duì)象。
### 前置/后置中間件
中間件是在請(qǐng)求具體的操作之前還是之后執(zhí)行,完全取決于中間件的定義本身。
下面是一個(gè)前置行為的中間件
~~~
<?php
namespace app\http\middleware;
class Before
{
public function handle($request, \Closure $next)
{
// 添加中間件執(zhí)行代碼
return $next($request);
}
}
~~~
下面是一個(gè)后置行為的中間件
~~~
<?php
namespace app\http\middleware;
class After
{
public function handle($request, \Closure $next)
{
$response = $next($request);
// 添加中間件執(zhí)行代碼
return $response;
}
}
~~~
### 注冊(cè)中間件
第一種方式:注冊(cè)全局中間件
你可以在應(yīng)用目錄下面定義`middleware.php`文件,使用下面的方式:
~~~
<?php
return [
\app\http\middleware\Auth::class,
'Check',
'Hello',
];
~~~
中間件的注冊(cè)應(yīng)該使用完整的類名,如果沒(méi)有指定命名空間則使用`app\http\middleware`作為命名空間。
全局中間件的執(zhí)行順序就是定義順序。可以在定義全局中間件的時(shí)候傳入中間件參數(shù),支持兩種方式傳入。
~~~
<?php
return [
[\app\http\middleware\Auth::class, 'admin'],
'Check',
'Hello:thinkphp',
];
~~~
上面的定義表示 給`Auth`中間件傳入`admin`參數(shù),給`Hello`中間件傳入`thinkphp`參數(shù)。
### 路由中間件
最常用的中間件注冊(cè)方式是注冊(cè)路由中間件
~~~
Route::rule('hello/:name', 'hello')
->middleware('Auth');
~~~
或者使用完整的中間件類名
~~~
Route::rule('hello/:name', 'hello')
->middleware(app\http\middleware\Auth::class);
~~~
支持對(duì)路由分組注冊(cè)中間件
~~~
Route::group('hello', function(){
Route::rule('hello/:name', 'hello');
})->middleware('Auth');
~~~
如果需要傳入額外參數(shù)給中間件,可以使用
~~~
Route::rule('hello/:name', 'hello')
->middleware('Auth:admin');
~~~
如果使用的是常量方式定義,可以在第二個(gè)參數(shù)傳入中間件參數(shù)。
~~~
Route::rule('hello/:name', 'hello')
->middleware(Auth::class, 'admin');
~~~
>[danger] 中間件方法參數(shù)只能有一個(gè),但可以支持任意類型,在`handle`方法的第三個(gè)參數(shù)傳入即可。
如果你不希望每次在路由中注冊(cè)完整的類名,還可以在應(yīng)用配置文件`middleware.php`中進(jìn)行中間件的預(yù)定義,指定中間件的別名。
~~~
return [
'auth' => 'app\http\middleware\Auth',
'check' => [
'user' => app\common\middleware\CheckUser::class
],
];
~~~
然后,在路由中使用別名注冊(cè)中間件。
~~~
Route::rule('hello/:name', 'hello')
->middleware(['auth', 'check.user']);
~~~
好了,更多的中間件用法還需要你親自實(shí)踐。
## 路由改進(jìn)和提速
新版本的路由改進(jìn)是最多的(幾乎整個(gè)過(guò)年都在調(diào)整路由組件^_^),我們知道路由無(wú)非是兩大要點(diǎn),路由定義和路由檢測(cè)。
路由定義涉及到一個(gè)規(guī)范化的問(wèn)題,新版路由在保持原來(lái)的用法前提下,內(nèi)部做了一些架構(gòu)和細(xì)節(jié)的調(diào)整,使得路由的用法更加對(duì)象化。如果你看源碼的話,就會(huì)發(fā)現(xiàn)核心類庫(kù)的`route`目錄下面新增了幾個(gè)類。
### 路由規(guī)則的變量用法改進(jìn)
路由定義方面主要對(duì)域名路由和路由分組的功能進(jìn)行了強(qiáng)化,以及路由規(guī)則的更靈活定義。
之前的路由規(guī)則中變量分兩種,普通變量和組合變量定義,新版把這兩種合二為一了(也就是說(shuō)兩種變量沒(méi)有任何區(qū)別,僅僅是表現(xiàn)方式不同,而且是出于兼容考慮)。你現(xiàn)在完全可以在路由規(guī)則中以任何方式定義路由變量。
例如你可以使用下面的路由規(guī)則而不用管目前的URL分隔符是什么:
~~~
Route::rule('item/:name_:id', 'order/index');
Route::rule('product-<category>:name', 'product/item');
~~~
另外,新版路由定義兩種變量方式`:name`和`<name> `可以混合使用,但建議統(tǒng)一使用`<name>`,在性能上略有優(yōu)勢(shì)(實(shí)際上,最終解析的時(shí)候系統(tǒng)會(huì)統(tǒng)一解析成后者)。
### 路由匹配算法改進(jìn)
路由檢測(cè)其實(shí)是最耗性能的,尤其是路由匹配這塊,因?yàn)榛旧隙际遣捎玫恼齽t匹配。在`5.1.6`版本之前,如果定義了100個(gè)路由,那么最后的那個(gè)路由規(guī)則可能需要遍歷100次才能正確匹配到路由,而且每個(gè)路由規(guī)則中的路由變量都是單獨(dú)匹配的,所以這個(gè)路由匹配的性能開(kāi)銷是隨著路由定義的數(shù)量指數(shù)上升的。
`5.1.6`版本開(kāi)始,系統(tǒng)對(duì)路由的匹配這塊進(jìn)行了算法優(yōu)化,靈感來(lái)自于`fastRoute`?;舅枷胧欠謨蓚€(gè)步驟優(yōu)化(思想其實(shí)很容易懂,但技術(shù)層面比較復(fù)雜,所以想了解怎么實(shí)現(xiàn)的話還是仔細(xì)看代碼吧~本文只闡述思想)。
第一個(gè)步驟是對(duì)單個(gè)路由規(guī)則的匹配算法進(jìn)行調(diào)整,不按照變量進(jìn)行多次匹配,而是把路由變量的正則合并到一起,然后整個(gè)路由規(guī)則只匹配一次(如果這個(gè)路由規(guī)則都是靜態(tài)的,那么基本上不需要正則匹配,采用的是更快的非正則檢測(cè)方式)。這個(gè)是新版默認(rèn)就開(kāi)啟的,相比較之前的版本,性能已經(jīng)提升明顯。
但路由的性能提速遠(yuǎn)非如此簡(jiǎn)單,第二個(gè)步驟的優(yōu)化策略是如果當(dāng)前匹配的路由分組下面有多個(gè)路由規(guī)則(確切的說(shuō)是滿足當(dāng)前請(qǐng)求類型的),則把這些滿足條件的路由規(guī)則合并成一個(gè)正則表達(dá)式進(jìn)行路由匹配。如果你的路由分組下面有100個(gè)滿足條件的路由規(guī)則,如果要訪問(wèn)最后的路由規(guī)則,之前的方式可能需要遍歷100次,而新版只需要進(jìn)行一次匹配。就算加上路由規(guī)則的合并開(kāi)銷,仍然是值得的。
如果需要使用分組路由規(guī)則的全局合并檢測(cè),需要開(kāi)啟下面的設(shè)置(另外一個(gè)方式是單獨(dú)對(duì)某個(gè)路由分組使用`mergeRuleRegex`方法,這種需求應(yīng)該不多):
~~~
// 合并分組路由規(guī)則
'route_rule_merge' => true,
~~~
那么到這是不是就結(jié)束了呢?不要忘了ThinkPHP`5.1`的路由有一個(gè)很創(chuàng)新的地方就是延遲解析,主要體現(xiàn)在路由分組或者域名路由。通常的路由定義是需要把定義的路由進(jìn)行一次解析處理,然后保存成我們方便檢測(cè)的一個(gè)數(shù)據(jù)結(jié)構(gòu)或者對(duì)象,但由于WEB請(qǐng)求的特殊性,每次請(qǐng)求都需要重復(fù)這種路由定義的解析過(guò)程,為了降低路由解析的開(kāi)銷,ThinkPHP只會(huì)在路由分組匹配之后才會(huì)實(shí)際去進(jìn)行該路由分組下面的路由解析過(guò)程,然后再進(jìn)行后續(xù)的路由檢測(cè),如果你的分組下面還有子分組,那么繼續(xù)按照這個(gè)方式解析。
不過(guò)路由的延遲解析功能默認(rèn)是關(guān)閉的,可以在應(yīng)用配置中開(kāi)啟:
~~~
// 開(kāi)啟路由延遲解析
'url_lazy_route' => true,
~~~
通過(guò)這三個(gè)步驟的優(yōu)化,我相信現(xiàn)在你應(yīng)該明白如何利用路由規(guī)則的合并以及路由的延遲解析機(jī)制來(lái)提升你的路由性能了吧。
如果你繼續(xù)深入路由的使用,還會(huì)發(fā)現(xiàn)一些細(xì)節(jié)的用法。
## 查詢安全性改進(jìn)
接下來(lái)要講的是新版對(duì)于查詢安全性的一個(gè)改進(jìn),引入了一個(gè)新的`Expression`類,對(duì)于這種類型的數(shù)據(jù),在查詢和寫(xiě)入操作的時(shí)候會(huì)保持原樣`SQL`(比較適合于使用SQL函數(shù)的情況),并且同時(shí)支持參數(shù)綁定功能。
為了方便,`Query`類增加了`raw`方法用于實(shí)例化一個(gè)`Expression`對(duì)象,我們可以這樣使用:
~~~
Db::name('user')
->field(Db::raw('id, name'))
->where(Db::raw('id > :id AND status = 1'), ['id' => 1])
->order(Db::raw('id desc'))
->select();
~~~
系統(tǒng)在解析的時(shí)候,支持對(duì)`field/where/order`方法的`Expression`對(duì)象的解析。
同時(shí)為了方便使用,提供了一些快捷方法,例如上面的例子可以改為:
~~~
Db::name('user')
->fieldRaw('id, name')
->whereRaw('id > :id AND status = 1', ['id' => 1])
->orderRaw('id desc')
->select();
~~~
> 當(dāng)然,大部分情況下,系統(tǒng)會(huì)自動(dòng)判斷是否需要使用`Expression`表達(dá)式對(duì)象,從而避免數(shù)據(jù)出現(xiàn)安全隱患。例如,當(dāng)你使用字符串條件,并且包含空格和函數(shù)用法的話,會(huì)自動(dòng)解析為`Expression`對(duì)象執(zhí)行查詢。
在數(shù)據(jù)寫(xiě)入方面一樣可以利用表達(dá)式方式來(lái)杜絕可能的安全隱患,例如:
~~~
Db::name('user')
->save($data);
~~~
當(dāng)你的`data`數(shù)據(jù)直接來(lái)自于表單提交數(shù)據(jù)的時(shí)候,會(huì)導(dǎo)致SQL注入的可能,新版會(huì)檢查數(shù)組數(shù)據(jù)的安全性,對(duì)`exp`表達(dá)式寫(xiě)入進(jìn)行更嚴(yán)格的類型檢查。
原來(lái)的`exp`數(shù)組用法將不可用,而必須改為:
~~~
Db::name('user')
->where('id', 1)
->save([
'score' => ['exp', Db::raw('score+1')],
]);
~~~
或者直接使用`exp`方法更新數(shù)據(jù)
~~~
Db::name('user')
->where('id', 1)
->exp('score', 'score+1')
->save();
~~~
這些查詢的安全特性同樣對(duì)模型適用,比如你需要使用SQL更新數(shù)據(jù)的時(shí)候,可以使用
~~~
$user = User::get(1);
$user->name = Db::raw('UPPER("thinkphp")');
$user->score = Db::raw('score+1');
$user->save();
~~~
新版的特性暫時(shí)就介紹這么多,還有一些細(xì)節(jié)等待各位去挖掘和分享。
- 值得升級(jí)到5.1的18個(gè)理由
- 5.1.7版本新特性
- JSON字段類型在ORM中的使用
- 文件下載響應(yīng)對(duì)象
- 教你使用5.1的數(shù)組對(duì)象查詢
- 模型三大利器之一:搜索器
- 在ThinkPHP中使用Yaconf
- 掌握命令行的表格輸出
- 5.1.25查詢參數(shù)綁定的改進(jìn)
- ThinkPHP安全規(guī)范指引
- 巧用數(shù)據(jù)集的排序功能實(shí)現(xiàn)統(tǒng)計(jì)排序
- think-orm ——基于5.1的獨(dú)立ORM庫(kù)
- think-template——基于ThinkPHP的獨(dú)立模板引擎
- ThinkPHP5.1.26版本發(fā)布——修正版本,包含安全更新
- ThinkPHP5.0和3.2再發(fā)安全更新
- 官宣:ThinkPHP發(fā)布首個(gè)LTS版本
- 你真的了解Db類和模型的正確使用姿勢(shì)么?
- 如何更有效的記錄和管理日志
- 模型三大利器之二:修改器
- ThinkPHP5.1.28版本發(fā)布——修正上一版本問(wèn)題,改進(jìn)關(guān)聯(lián)查詢
- 模型三大利器之三:獲取器
- API版本控制的幾種思路
- ThinkPHP5.2第一個(gè)Beta版本發(fā)布測(cè)試
- 讓你少犯錯(cuò)的數(shù)據(jù)查詢基本原則
- ThinkPHP發(fā)布5.1.29版本——常規(guī)更新
- 這15個(gè)好習(xí)慣讓你更容易升級(jí)到5.2
- 如何有效提高ThinkPHP的應(yīng)用性能
- 讓你提高開(kāi)發(fā)效率的查詢技巧
- 模型關(guān)聯(lián)查詢不完全指南
- 5.2發(fā)布Beta2版本——統(tǒng)一和精簡(jiǎn)大量用法
- ThinkPHP發(fā)布5.1.30版本——支持微秒時(shí)間字段寫(xiě)入
- ThinkPHP的數(shù)據(jù)緩存使用
- ThinkPHP5.2安裝及入口文件
- ThinkPHP榮獲2018 年度最受歡迎中國(guó)開(kāi)源開(kāi)發(fā)框架第1名
- 5.1路由使用心得技巧
- ThinkPHP5.*版本發(fā)布安全更新
- ThinkPHP項(xiàng)目及代碼規(guī)范指北
- 5.2版本的設(shè)計(jì)規(guī)范指導(dǎo)
- ThinkPHP5.1.32版本發(fā)布——圣誕快樂(lè)
- 利用Trait特性給模型增加樂(lè)觀鎖功能
- 5.2數(shù)據(jù)庫(kù)和模型的變化(摘要)
- ThinkPHP模板引擎實(shí)現(xiàn)和常見(jiàn)問(wèn)題
- ThinkPHP5.0.24版本發(fā)布——安全更新
- 不忘初心,方得始終——ThinkPHP十三周年報(bào)告
- ThinkPHP5+相關(guān)資源匯總
- 異步社區(qū)ThinkPHP周年慶專享優(yōu)惠活動(dòng)
- 5.2路由的調(diào)整和改進(jìn)
- ThinkPHP發(fā)布5.1.33版本——包含安全更新
- ThinkPHP擴(kuò)展開(kāi)發(fā)指南
- ThinkPHP發(fā)布5.2Beta3版本
- ThinkPHP發(fā)布5.1.34版本——喜迎新年
- ThinkPHP發(fā)布5.2RC1版本
- ThinkPHP發(fā)布5.1.35版本——常規(guī)更新
- 5.2配置類的調(diào)整
- 5.2時(shí)間查詢的改進(jìn)和優(yōu)化
- 5.2RC版本升級(jí)不完全指導(dǎo)(僅供學(xué)習(xí)參考)
- ThinkPHP5.2版本正式變更為6.0版本
- ThinkPHP百度云云虛擬主機(jī)專享免費(fèi)活動(dòng)
- 事件系統(tǒng)以及查詢事件、模型事件的使用
- ThinkPHP6.0RC2版本發(fā)布——架構(gòu)升級(jí)、精簡(jiǎn)核心
- ThinkPHP5.1.36LTS版本發(fā)布——常規(guī)更新
- 新版Session和Cookie設(shè)計(jì)變化
- ThinkPHP5.1.37版本發(fā)布——常規(guī)更新
- ThinkPHP6.0RC3版本發(fā)布——細(xì)節(jié)完善,體驗(yàn)優(yōu)化
- 6.0中間件使用詳解
- Composer各大廠商鏡像地址
- ThinkPHP6.0發(fā)布計(jì)劃公告
- 「ThinkPHP開(kāi)發(fā)者周刊」招募志愿者
- ThinkPHP6.0日志變化
- ThinkPHP5.1.38版本發(fā)布——常規(guī)更新
- ThinkPHP6.0RC4版本發(fā)布——ORM獨(dú)立,日志多通道支持
- ThinkORM2.0開(kāi)發(fā)指南上線
- ThinkPHP6.0RC5版本發(fā)布——多應(yīng)用模式獨(dú)立,中間件機(jī)制調(diào)整
- ThinkPHP6.0版本發(fā)布——程序員節(jié)福利
- ThinkPHP5.1.39LTS版本發(fā)布——常規(guī)更新
- ThinkPHP6.0.1版本發(fā)布——圣誕快樂(lè)!
- 回顧2019,展望2020!
- ThinkPHPV6.0.2版本發(fā)布——2020新春快樂(lè)!
- 周年福利系列:Swoole合作優(yōu)惠
- 億速云成為T(mén)hinkPHPV6.0獨(dú)家贊助發(fā)布商??
- 新冠疫情工具和限免資源專題(保持更新中)
- 周年福利系列:創(chuàng)宇信用認(rèn)證合作優(yōu)惠
- 周年福利系列:碼云企業(yè)版限時(shí)10%優(yōu)惠
- 周年福利系列:想天短說(shuō)抵現(xiàn)優(yōu)惠
- think-swoole直播:從零開(kāi)始掌握swoole開(kāi)發(fā)
- 周年福利系列:B2C開(kāi)源電商ShopXO授權(quán)8折優(yōu)惠
- 周年福利系列:LayuiAdmin 永久授權(quán)限時(shí)優(yōu)惠
- ThinkPHP資源導(dǎo)航站上線——構(gòu)建生態(tài) 服務(wù)未來(lái)
- ThinkPHP官方技術(shù)支持服務(wù)和應(yīng)用服務(wù)市場(chǎng)上線公測(cè)
- ThinkPHP市場(chǎng)精選——推廣基本要素
- ThinkPHP市場(chǎng)精選——客服聊天專題
- ThinkPHPV6.0.3版本發(fā)布——端午安康
- ThinkPHP開(kāi)發(fā)者扶持計(jì)劃
- 6.0.3版本關(guān)鍵更新及升級(jí)事項(xiàng)
- 「ThinkPHP開(kāi)發(fā)者周刊」改版重啟
- ThinkPHP市場(chǎng)精選——企業(yè)建站專題
- ThinkPHP 提供統(tǒng)一API接口服務(wù)
- ThinkPHP市場(chǎng)精選——直播電商專題
- ThinkAPI服務(wù)SDK發(fā)布
- 官方服務(wù)市場(chǎng)啟用獨(dú)立子域名
- ThinkPHP市場(chǎng)精選——刷臉支付專題
- ThinkAPI推出會(huì)員服務(wù)計(jì)劃
- ThinkPHPV6.0.4版本發(fā)布——中秋國(guó)慶雙節(jié)快樂(lè)
- ThinkPHPV5.1.40版本發(fā)布——常規(guī)更新
- 1024程序員節(jié)福利走一波
- ThinkPHP V6.0.5版本發(fā)布——兼容Composer2.0
- 知識(shí)圖譜應(yīng)用場(chǎng)景——源論技術(shù)沙龍
- ThinkPHP5.*版本改進(jìn)Composer2.0的兼容
- 官方市場(chǎng)雙十一精選推薦
- 技術(shù)人做產(chǎn)品有機(jī)會(huì)么(文末送課程)
- 本周秒殺——古德云售后獲客營(yíng)銷系統(tǒng)
- ThinkAPI服務(wù)更新——支持接口分組和PHP版本依賴調(diào)整
- PHP8新特性盤(pán)點(diǎn)
- PHP8新特性系列:構(gòu)造器屬性提升使用及注意事項(xiàng)
- ThinkPHP2021新年寄語(yǔ)
- ThinkPHP V6.0.6&V5.1.41版本發(fā)布——兼容PHP8.0
- PHP如何更優(yōu)雅地調(diào)用API接口
- ThinkPHP V6.0.7發(fā)布——修正版本
- ThinkAPI服務(wù)更新——IP白名單
- 最新版ThinkORM對(duì)于時(shí)間字段的調(diào)整
- ThinkAPI短信接口正式上線
- ThinkPHP V6.0.8版本發(fā)布——多環(huán)境變量配置支持
- 頂想云寫(xiě)作服務(wù)開(kāi)啟第一次公測(cè)
- ThinkSSL上線——官方SSL/TLS證書(shū)服務(wù)
- MDBootstrap國(guó)內(nèi)用戶福利——ThinkPHP官方市場(chǎng)首發(fā)
- ThinkPHP V6.0.9版本發(fā)布——常規(guī)更新
- ThinkORM功能盤(pán)點(diǎn)——虛擬模型
- 全面支持主流GIT版本庫(kù)——云寫(xiě)作服務(wù)第二次公測(cè)
- 云寫(xiě)作服務(wù)私有化部署方案之:版本庫(kù)私有化
- 看云雙十一活動(dòng)
- ThinkPHP V6.0.10LTS發(fā)布——兼容PHP8.1
- ThinkPHP V6.0.12發(fā)布——命令行兼容8.1
- 頂想云知識(shí)管理上線公測(cè)——構(gòu)建企業(yè)文檔中心和知識(shí)庫(kù)
- 頂想云上線——助力生態(tài)數(shù)字化建設(shè)
- 618活動(dòng)進(jìn)行中——官方市場(chǎng)迎來(lái)一波更新
- 頂想云知識(shí)管理正式上線——看云文檔啟動(dòng)遷移服務(wù)
- ThinkPHP V6.0.13發(fā)布——常規(guī)更新
- 頂想云網(wǎng)站助理服務(wù)上線——構(gòu)建產(chǎn)品支持服務(wù)
- ThinkPHP發(fā)布6.1.0&6.0.14版本——安全更新
- ThinkPHP新版社區(qū)上線試運(yùn)營(yíng)
- ThinkAPI上架人臉核身接口——助力網(wǎng)站實(shí)名認(rèn)證
- 辭舊迎新——舊版社區(qū)停止注冊(cè)及發(fā)帖
- ThinkPHP6.1.2版本發(fā)布——兼容PHP8.2
