ThinkPHP 發布 5.2 Beta3 版本
本次更新了大量的(de)細節,進一(yī)步統一(yī)和(hé)精簡了用法,并且新增了一(yī)些功能。
在正式版發布之前,不建議用于正式項目,目前也還沒有完善的(de)文檔和(hé)詳細的(de)測試。
主要更新
相比較beta2版本(Beta2版本更新參考這裏),除了一(yī)些修正和(hé)改進外,主要包含了如(rú)下的(de)功能更新和(hé)調整。
視(shì)圖和(hé)模闆引擎從核心分離(lí)
視(shì)圖和(hé)模闆引擎類不再內(nèi)置到核心框架,需要的(de)時候可(kě)以單獨通過
composer require topthink/think-view
安裝,如(rú)果使用
composer create-project topthink/think
會默認安裝該組件(如(rú)果不需要使用的(de)話可(kě)以自(zì)己卸載topthink/think-view)。
安裝後,由于內(nèi)置的(de)think\Controller類不再封裝視(shì)圖方法,如(rú)果你的(de)控制器類需要調用fetch/display/assign等視(shì)圖方法,必須繼承 think\ViewController類,使用view助手函數方式用法不變。
取消數據庫的(de)setInc/setDec/setField方法
原來的(de)setInc/setDec/setField方法不再支持,使用inc/dec/update方法替代。例如(rú):
Db::name('user')->where('id', 1)
->inc('exp')
->dec('score')
->update();取消查詢eq/neq/gt/lt/egt/elt表達式
由于存在兩種用法,并且不夠直觀,全部統一(yī)為(wèi)更直觀的(de)用法。
下面的(de)用法不再支持
Db::name('user')->where('id', 'egt', 1)
->where('status', 'neq' ,1)
->select();統一(yī)使用
Db::name('user')->where('id', '>=', 1)
->where('status', '<>' ,1)
->select();取消分表功能
出于分表的(de)性能問題和(hé)複雜性,不再提供分表方法,建議使用數據庫的(de)分區功能替代。
增加年(nián)/月/日的(de)便捷日期查詢方法
可(kě)以使用下面的(de)便捷日期查詢
// 查詢2018年(nián)的(de)博客數
Db::name('blog')->whereYear('create_time', '2018')->count();
// 查詢2018年(nián)12月的(de)博客數
Db::name('blog')->whereMonth('create_time', '2018-12')->count();
// 查詢2018年(nián)12月24日的(de)博客數
Db::name('blog')->whereDay('create_time', '2018-12-24')->count();query原生查詢也可(kě)以支持查詢緩存
使用query進行SQL語句查詢的(de)時候也可(kě)以支持查詢緩存,例如(rú):
Db::cache('cache_key')->query("select * from blog where create_time > '2018-12-1'");如(rú)果使用了數據庫的(de)讀寫分離(lí),需要從主庫查詢的(de)話,需要使用
Db::master(true)->query("select * from blog where create_time > '2018-12-1'");數據庫的(de)查詢統計合并
數據庫的(de)查詢次數合并到queryTimes,不再區分讀寫操作,你可(kě)以使用下面的(de)方法獲取當前請求的(de)數據庫查詢次數(包括讀寫)
Db::getQueryTimes();
模型延遲自(zì)動保存
模型增加延遲保存方法lazySave,調用該方法後不會馬上保存數據,僅僅是保存在內(nèi)存中,當前模型對象銷毀的(de)時候或者下次顯式調用save方法的(de)時候都會自(zì)動保存到數據庫。
$user = User::find(1); $user->name = 'thinkphp'; $user->lazySave(); ... $user->score = 100; $user->save();
模型事件調整
模型事件不再支持使用event方法注冊事件,統一(yī)使用模型事件觀察者類,你隻需要在模型定義或者初始化的(de)時候設置observerClass屬性。
<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
protected $observerClass = 'app\index\observe\User';
}所有的(de)模型事件統一(yī)在觀察者類中進行定義,方法的(de)命名規範如(rú)下:
<?php
namespace app\index\observe;
class User
{
public function onAfterRead($user){
$user->extra = 'extra';
}
public function onBeforeWrite($user){
$user->extra = 'extra';
}
}并且模型增加after_read事件,在查詢後創建模型對象實例的(de)時候觸發。
模型屬性和(hé)數據表字段的(de)對應關系
默認情況下,模型對象數據字段嚴格區分大小寫,你可(kě)以關閉嚴格模式(前提是必須保持數據表字段的(de)小寫和(hé)下劃線定義規範),然後在模型中使用的(de)時候,如(rú)果使用駝峰命名調用,則會自(zì)動轉換為(wèi)小寫和(hé)下劃線規範的(de)字段(關連模型除外),例如(rú):
<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
protected $strict = false;
}然後,下面的(de)代碼
$user = User::find(); echo $user->nick_name; $user->nick_name = 'test'; $user->save();
和(hé)下面的(de)用法是等效的(de)
$user = User::find(); echo $user->nickName; $user->nickName = 'test'; $user->save();
如(rú)果你的(de)數據表字段不符合規範(存在大小寫混合使用的(de)情況),那麽必須在模型中開啓
strict屬性。
增加樂(yuè)觀鎖功能
和(hé)軟删除一(yī)樣,增加了一(yī)個think\model\concern\OptimLockTrait用于方便引入擴展模型的(de)樂(yuè)觀鎖功能。
<?php
namespace app\index\model;
use think\model\conern\OptimLock;
use think\Model;
class User extends Model
{
use OptimLock;
protected $optimLock = 'lock_version';
}增加PSR-11支持
支持PSR-11規範,增加psr/container依賴,Container類增加pull方法替代之前的(de)靜态get方法。
增加閉包數據的(de)緩存序列化支持
添加了opis/closure依賴用于支持閉包的(de)序列化支持。
增加自(zì)動多應用支持
支持在同一(yī)個入口文件中訪問多個應用,并且支持應用的(de)映射關系以及自(zì)定義。
例如(rú)在index.php入口文件中使用:
(new App())->autoMulti()->run()->send();
就可(kě)以不必創建入口文件自(zì)動通過URL訪問多個應用
http://serverName/index.php/admin
如(rú)果你的(de)默認應用不是index(默認為(wèi)入口文件名),那麽可(kě)以通過name方法指定默認應用。
(new App())->autoMulti()
->name('admin')
->run()
->send();支持應用名的(de)别名映射,例如(rú):
(new App())->autoMulti([ 'think' => 'admin', // 把admin應用映射為(wèi)think ])->run()->send();
如(rú)果需要對某個應用進行自(zì)定義,可(kě)以使用
(new App())->autoMulti([
'admin' => function($app) {
$app->debug(true)->useClassSuffix();
}
])->run()->send();取消别名路由
因為(wèi)使用場景有限和(hé)性能開銷問題,取消原來的(de)别名路由功能,建議使用資源路由或者單獨的(de)路由替代。
取消快捷路由
因為(wèi)使用場景有限和(hé)不太符合規範,取消了原來的(de)控制器快捷路由功能。
取消空操作功能
建議使用分組MISS路由功能替代。
應用類庫後綴規範
取消了controller_suffix和(hé)class_suffix配置參數,App類增加了controllerSuffix方法用于開啓控制器類庫的(de)Controller後綴(默認不開啓)。其它應用類庫的(de)後綴由項目自(zì)己決定,框架不再強制規範。
需要注意的(de)是,如(rú)果你的(de)模型類命名使用了
Model後綴的(de)話,一(yī)定要定義name屬性或者table屬性。
異常響應輸出類型
增加exception_response_type配置參數用于設置異常響應輸出的(de)類型,默認為(wèi)html類型。如(rú)果你的(de)應用全部用于接口開發,可(kě)以配置為(wèi)json類型。
更新日志
路由
路由檢測作為(wèi)
AppInit事件響應獨立出App類,可(kě)配置事件定義文件不使用路由功能路由定義的(de)方法簡化
option和(hé)pattern參數,統一(yī)使用方法進行路由參數和(hé)變量規則設置取消别名路由和(hé)快捷路由功能
取消多級控制器的(de)自(zì)動搜索功能
路由分組不再支持數組方式定義分鍾下面的(de)路由規則
取消路由的(de)
mergeExtraVars方法和(hé)設置提升路由變量替換的(de)性能
判斷路由規則定義添加對請求類型的(de)判斷
路由地(dì)址支持
Dispatch對象
數據庫和(hé)模型
改進模型的(de)數據類型強制轉換對
Expression對象的(de)支持模型查詢統一(yī)返回對象 取消
findOrEmpty方法 模型類增加isEmpty方法增加
raw助手函數修正
mysql的(de)regexp查詢改進聚合查詢方法的(de)
field參數支持Expressionwhere方法支持傳入Query對象改進
Connection類getRealSql方法Query類
cache方法支持傳入CacheItem類Query類
find/select/cursor方法不再支持閉包模型增加
lazySave方法 用于延遲自(zì)動保存統一(yī)模型數據的(de)讀取和(hé)寫入,支持駝峰和(hé)下劃線自(zì)動智能識别
取消數據庫的(de)分表功能支持
改進
join方法支持參數綁定取消
setInc/setDec方法和(hé)setField方法模型增加
strict屬性 支持開啓字段區分大小寫 默認不區分,數據庫字段強制使用小寫取消查詢方法的(de)
eq neq lt gt elt egt等表達式統一(yī)模型事件為(wèi)使用模型事件觀察者 廢棄
event方法注冊模型事件增加
after_read模型事件增加
whereYear/whereMonth/whereDay查詢方法Query類
query方法支持查詢緩存增加
procedure方法用于指定是否為(wèi)存儲過程調用簡化
cursor、query和(hé)execute方法參數廢棄數據庫執行次數 合并到查詢次數
Connection類
getCursor方法調整 取消relation參數取消一(yī)對一(yī)關聯的(de)
setEagerlyType方法改進軟删除
destory方法重複執行事件的(de)問題修正多對多中間表的(de)寫入
改進關聯模型的(de)
save方法增加樂(yuè)觀鎖
Trait
控制器
取消
ActionBegin事件改進控制器中間件執行
修正控制器名稱獲取
改進App類的(de)
useClassSuffix方法的(de)默認值取消
controller_suffix配置,改用App類的(de)controllerSuffix方法設置取消
url_controller_layer配置,改用App類的(de)controllerLayer方法設置取消
class_suffix配置取消
App類的(de)action方法取消
empty_controller配置,改用App類的(de)emptyController方法設置取消空操作
緩存
改進緩存
CacheItem類增加expire和(hé)tag方法支持改進
CacheItem類getExpire方法改進
CacheItem的(de)緩存有效期處理(lǐ)改進緩存類的(de)
remember方法FIX:當使用
complex緩存的(de)時候,通過store方法選擇驅動,提供給connect的(de)參數類型錯誤改進Redis緩存驅動的(de)
tag支持改進
Redis驅動改進緩存類 取消
xcache驅動改進緩存标簽的(de)獲取
增加緩存序列化的(de)閉包支持
驗證
改進
unique驗證方法改進驗證類的(de)自(zì)定義驗證正則
驗證方法調整
增加
validate助手函數
其它
改進
Cookie類的(de)setCookie方法App類增加classBaseName方法改進
Url生成的(de)端口問題修正
Request類param方法語言檢測、路由檢查、請求緩存功能獨立作為(wèi)事件響應
Request增加單獨的(de)middleware方法傳遞中間件變量取消
App類的(de)log方法增加
exception_response_type配置參數
本次更新了大量的(de)細節,進一(yī)步統一(yī)和(hé)精簡了用法,并且新增了一(yī)些功能。
在正式版發布之前,不建議用于正式項目,目前也還沒有完善的(de)文檔和(hé)詳細的(de)測試。
主要更新
相比較beta2版本(Beta2版本更新參考這裏),除了一(yī)些修正和(hé)改進外,主要包含了如(rú)下的(de)功能更新和(hé)調整。
視(shì)圖和(hé)模闆引擎從核心分離(lí)
視(shì)圖和(hé)模闆引擎類不再內(nèi)置到核心框架,需要的(de)時候可(kě)以單獨通過
composer require topthink/think-view
安裝,如(rú)果使用
composer create-project topthink/think
會默認安裝該組件(如(rú)果不需要使用的(de)話可(kě)以自(zì)己卸載topthink/think-view)。
安裝後,由于內(nèi)置的(de)think\Controller類不再封裝視(shì)圖方法,如(rú)果你的(de)控制器類需要調用fetch/display/assign等視(shì)圖方法,必須繼承 think\ViewController類,使用view助手函數方式用法不變。
取消數據庫的(de)setInc/setDec/setField方法
原來的(de)setInc/setDec/setField方法不再支持,使用inc/dec/update方法替代。例如(rú):
Db::name('user')->where('id', 1)
->inc('exp')
->dec('score')
->update();取消查詢eq/neq/gt/lt/egt/elt表達式
由于存在兩種用法,并且不夠直觀,全部統一(yī)為(wèi)更直觀的(de)用法。
下面的(de)用法不再支持
Db::name('user')->where('id', 'egt', 1)
->where('status', 'neq' ,1)
->select();統一(yī)使用
Db::name('user')->where('id', '>=', 1)
->where('status', '<>' ,1)
->select();取消分表功能
出于分表的(de)性能問題和(hé)複雜性,不再提供分表方法,建議使用數據庫的(de)分區功能替代。
增加年(nián)/月/日的(de)便捷日期查詢方法
可(kě)以使用下面的(de)便捷日期查詢
// 查詢2018年(nián)的(de)博客數
Db::name('blog')->whereYear('create_time', '2018')->count();
// 查詢2018年(nián)12月的(de)博客數
Db::name('blog')->whereMonth('create_time', '2018-12')->count();
// 查詢2018年(nián)12月24日的(de)博客數
Db::name('blog')->whereDay('create_time', '2018-12-24')->count();query原生查詢也可(kě)以支持查詢緩存
使用query進行SQL語句查詢的(de)時候也可(kě)以支持查詢緩存,例如(rú):
Db::cache('cache_key')->query("select * from blog where create_time > '2018-12-1'");如(rú)果使用了數據庫的(de)讀寫分離(lí),需要從主庫查詢的(de)話,需要使用
Db::master(true)->query("select * from blog where create_time > '2018-12-1'");數據庫的(de)查詢統計合并
數據庫的(de)查詢次數合并到queryTimes,不再區分讀寫操作,你可(kě)以使用下面的(de)方法獲取當前請求的(de)數據庫查詢次數(包括讀寫)
Db::getQueryTimes();
模型延遲自(zì)動保存
模型增加延遲保存方法lazySave,調用該方法後不會馬上保存數據,僅僅是保存在內(nèi)存中,當前模型對象銷毀的(de)時候或者下次顯式調用save方法的(de)時候都會自(zì)動保存到數據庫。
$user = User::find(1); $user->name = 'thinkphp'; $user->lazySave(); ... $user->score = 100; $user->save();
模型事件調整
模型事件不再支持使用event方法注冊事件,統一(yī)使用模型事件觀察者類,你隻需要在模型定義或者初始化的(de)時候設置observerClass屬性。
<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
protected $observerClass = 'app\index\observe\User';
}所有的(de)模型事件統一(yī)在觀察者類中進行定義,方法的(de)命名規範如(rú)下:
<?php
namespace app\index\observe;
class User
{
public function onAfterRead($user){
$user->extra = 'extra';
}
public function onBeforeWrite($user){
$user->extra = 'extra';
}
}并且模型增加after_read事件,在查詢後創建模型對象實例的(de)時候觸發。
模型屬性和(hé)數據表字段的(de)對應關系
默認情況下,模型對象數據字段嚴格區分大小寫,你可(kě)以關閉嚴格模式(前提是必須保持數據表字段的(de)小寫和(hé)下劃線定義規範),然後在模型中使用的(de)時候,如(rú)果使用駝峰命名調用,則會自(zì)動轉換為(wèi)小寫和(hé)下劃線規範的(de)字段(關連模型除外),例如(rú):
<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
protected $strict = false;
}然後,下面的(de)代碼
$user = User::find(); echo $user->nick_name; $user->nick_name = 'test'; $user->save();
和(hé)下面的(de)用法是等效的(de)
$user = User::find(); echo $user->nickName; $user->nickName = 'test'; $user->save();
如(rú)果你的(de)數據表字段不符合規範(存在大小寫混合使用的(de)情況),那麽必須在模型中開啓
strict屬性。
增加樂(yuè)觀鎖功能
和(hé)軟删除一(yī)樣,增加了一(yī)個think\model\concern\OptimLockTrait用于方便引入擴展模型的(de)樂(yuè)觀鎖功能。
<?php
namespace app\index\model;
use think\model\conern\OptimLock;
use think\Model;
class User extends Model
{
use OptimLock;
protected $optimLock = 'lock_version';
}增加PSR-11支持
支持PSR-11規範,增加psr/container依賴,Container類增加pull方法替代之前的(de)靜态get方法。
增加閉包數據的(de)緩存序列化支持
添加了opis/closure依賴用于支持閉包的(de)序列化支持。
增加自(zì)動多應用支持
支持在同一(yī)個入口文件中訪問多個應用,并且支持應用的(de)映射關系以及自(zì)定義。
例如(rú)在index.php入口文件中使用:
(new App())->autoMulti()->run()->send();
就可(kě)以不必創建入口文件自(zì)動通過URL訪問多個應用
http://serverName/index.php/admin
如(rú)果你的(de)默認應用不是index(默認為(wèi)入口文件名),那麽可(kě)以通過name方法指定默認應用。
(new App())->autoMulti()
->name('admin')
->run()
->send();支持應用名的(de)别名映射,例如(rú):
(new App())->autoMulti([ 'think' => 'admin', // 把admin應用映射為(wèi)think ])->run()->send();
如(rú)果需要對某個應用進行自(zì)定義,可(kě)以使用
(new App())->autoMulti([
'admin' => function($app) {
$app->debug(true)->useClassSuffix();
}
])->run()->send();取消别名路由
因為(wèi)使用場景有限和(hé)性能開銷問題,取消原來的(de)别名路由功能,建議使用資源路由或者單獨的(de)路由替代。
取消快捷路由
因為(wèi)使用場景有限和(hé)不太符合規範,取消了原來的(de)控制器快捷路由功能。
取消空操作功能
建議使用分組MISS路由功能替代。
應用類庫後綴規範
取消了controller_suffix和(hé)class_suffix配置參數,App類增加了controllerSuffix方法用于開啓控制器類庫的(de)Controller後綴(默認不開啓)。其它應用類庫的(de)後綴由項目自(zì)己決定,框架不再強制規範。
需要注意的(de)是,如(rú)果你的(de)模型類命名使用了
Model後綴的(de)話,一(yī)定要定義name屬性或者table屬性。
異常響應輸出類型
增加exception_response_type配置參數用于設置異常響應輸出的(de)類型,默認為(wèi)html類型。如(rú)果你的(de)應用全部用于接口開發,可(kě)以配置為(wèi)json類型。
更新日志
路由
路由檢測作為(wèi)
AppInit事件響應獨立出App類,可(kě)配置事件定義文件不使用路由功能路由定義的(de)方法簡化
option和(hé)pattern參數,統一(yī)使用方法進行路由參數和(hé)變量規則設置取消别名路由和(hé)快捷路由功能
取消多級控制器的(de)自(zì)動搜索功能
路由分組不再支持數組方式定義分鍾下面的(de)路由規則
取消路由的(de)
mergeExtraVars方法和(hé)設置提升路由變量替換的(de)性能
判斷路由規則定義添加對請求類型的(de)判斷
路由地(dì)址支持
Dispatch對象
數據庫和(hé)模型
改進模型的(de)數據類型強制轉換對
Expression對象的(de)支持模型查詢統一(yī)返回對象 取消
findOrEmpty方法 模型類增加isEmpty方法增加
raw助手函數修正
mysql的(de)regexp查詢改進聚合查詢方法的(de)
field參數支持Expressionwhere方法支持傳入Query對象改進
Connection類getRealSql方法Query類
cache方法支持傳入CacheItem類Query類
find/select/cursor方法不再支持閉包模型增加
lazySave方法 用于延遲自(zì)動保存統一(yī)模型數據的(de)讀取和(hé)寫入,支持駝峰和(hé)下劃線自(zì)動智能識别
取消數據庫的(de)分表功能支持
改進
join方法支持參數綁定取消
setInc/setDec方法和(hé)setField方法模型增加
strict屬性 支持開啓字段區分大小寫 默認不區分,數據庫字段強制使用小寫取消查詢方法的(de)
eq neq lt gt elt egt等表達式統一(yī)模型事件為(wèi)使用模型事件觀察者 廢棄
event方法注冊模型事件增加
after_read模型事件增加
whereYear/whereMonth/whereDay查詢方法Query類
query方法支持查詢緩存增加
procedure方法用于指定是否為(wèi)存儲過程調用簡化
cursor、query和(hé)execute方法參數廢棄數據庫執行次數 合并到查詢次數
Connection類
getCursor方法調整 取消relation參數取消一(yī)對一(yī)關聯的(de)
setEagerlyType方法改進軟删除
destory方法重複執行事件的(de)問題修正多對多中間表的(de)寫入
改進關聯模型的(de)
save方法增加樂(yuè)觀鎖
Trait
控制器
取消
ActionBegin事件改進控制器中間件執行
修正控制器名稱獲取
改進App類的(de)
useClassSuffix方法的(de)默認值取消
controller_suffix配置,改用App類的(de)controllerSuffix方法設置取消
url_controller_layer配置,改用App類的(de)controllerLayer方法設置取消
class_suffix配置取消
App類的(de)action方法取消
empty_controller配置,改用App類的(de)emptyController方法設置取消空操作
緩存
改進緩存
CacheItem類增加expire和(hé)tag方法支持改進
CacheItem類getExpire方法改進
CacheItem的(de)緩存有效期處理(lǐ)改進緩存類的(de)
remember方法FIX:當使用
complex緩存的(de)時候,通過store方法選擇驅動,提供給connect的(de)參數類型錯誤改進Redis緩存驅動的(de)
tag支持改進
Redis驅動改進緩存類 取消
xcache驅動改進緩存标簽的(de)獲取
增加緩存序列化的(de)閉包支持
驗證
改進
unique驗證方法改進驗證類的(de)自(zì)定義驗證正則
驗證方法調整
增加
validate助手函數
其它
改進
Cookie類的(de)setCookie方法App類增加classBaseName方法改進
Url生成的(de)端口問題修正
Request類param方法語言檢測、路由檢查、請求緩存功能獨立作為(wèi)事件響應
Request增加單獨的(de)middleware方法傳遞中間件變量取消
App類的(de)log方法增加
exception_response_type配置參數
文章(zhāng)轉載自(zì) 開源中國社區 [http://www.oschina.net]
編輯:--ns868
南順網絡








