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\OptimLock
Trait用于方便引入擴展模型的(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
參數支持Expression
where
方法支持傳入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\OptimLock
Trait用于方便引入擴展模型的(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
參數支持Expression
where
方法支持傳入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