ThinkPHP 釋出 5.2 Beta3 版本
本次更新了大量的細節,進一步統一和精簡了用法,並且新增了一些功能。
在正式版釋出之前,不建議用於正式專案,目前也還沒有完善的文件和詳細的測試。
主要更新
相比較beta2
版本(
Beta2
版本更新參考這裡
),除了一些修正和改進外,主要包含了如下的功能更新和調整。
檢視和模板引擎從核心分離
檢視和模板引擎類不再內建到核心框架,需要的時候可以單獨通過
composer require topthink/think-view
安裝,如果使用
composer create-project topthink/think
會預設安裝該元件(如果不需要使用的話可以自己解除安裝topthink/think-view
)。
安裝後,由於內建的think\Controller
類不再封裝檢視方法,如果你的控制器類需要呼叫fetch
/display
/assign
等檢視方法,必須繼承 think\ViewController
類,使用view
助手函式方式用法不變。
取消資料庫的setInc
/setDec
/setField
方法
原來的setInc
/setDec
/setField
方法不再支援,使用inc
/dec
/update
方法替代。例如:
Db::name('user')->where('id', 1) ->inc('exp') ->dec('score') ->update();
取消查詢eq/neq/gt/lt/egt/elt
表示式
由於存在兩種用法,並且不夠直觀,全部統一為更直觀的用法。
下面的用法不再支援
Db::name('user')->where('id', 'egt', 1) ->where('status', 'neq' ,1) ->select();
統一使用
Db::name('user')->where('id', '>=', 1) ->where('status', '<>' ,1) ->select();
取消分表功能
出於分表的效能問題和複雜性,不再提供分表方法,建議使用資料庫的分割槽功能替代。
增加年/月/日的便捷日期查詢方法
可以使用下面的便捷日期查詢
// 查詢2018年的部落格數 Db::name('blog')->whereYear('create_time', '2018')->count(); // 查詢2018年12月的部落格數 Db::name('blog')->whereMonth('create_time', '2018-12')->count(); // 查詢2018年12月24日的部落格數 Db::name('blog')->whereDay('create_time', '2018-12-24')->count();
query
原生查詢也可以支援查詢快取
使用query進行SQL語句查詢的時候也可以支援查詢快取,例如:
Db::cache('cache_key')->query("select * from blog where create_time > '2018-12-1'");
如果使用了資料庫的讀寫分離,需要從主庫查詢的話,需要使用
Db::master(true)->query("select * from blog where create_time > '2018-12-1'");
資料庫的查詢統計合併
資料庫的查詢次數合併到queryTimes
,不再區分讀寫操作,你可以使用下面的方法獲取當前請求的資料庫查詢次數(包括讀寫)
Db::getQueryTimes();
模型延遲自動儲存
模型增加延遲儲存方法lazySave
,呼叫該方法後不會馬上儲存資料,僅僅是儲存在記憶體中,當前模型物件銷燬的時候或者下次顯式呼叫save
方法的時候都會自動儲存到資料庫。
$user = User::find(1); $user->name = 'thinkphp'; $user->lazySave(); ... $user->score = 100; $user->save();
模型事件調整
模型事件不再支援使用event
方法註冊事件,統一使用模型事件觀察者類,你只需要在模型定義或者初始化的時候設定observerClass
屬性。
<?php namespace app\index\model; use think\Model; class User extends Model { protected $observerClass = 'app\index\observe\User'; }
所有的模型事件統一在觀察者類中進行定義,方法的命名規範如下:
<?php namespace app\index\observe; class User { public function onAfterRead($user){ $user->extra = 'extra'; } public function onBeforeWrite($user){ $user->extra = 'extra'; } }
並且模型增加after_read
事件,在查詢後建立模型物件例項的時候觸發。
模型屬性和資料表字段的對應關係
預設情況下,模型物件資料欄位嚴格區分大小寫,你可以關閉嚴格模式(前提是必須保持資料表字段的小寫和下劃線定義規範),然後在模型中使用的時候,如果使用駝峰命名呼叫,則會自動轉換為小寫和下劃線規範的欄位(關連模型除外),例如:
<?php namespace app\index\model; use think\Model; class User extends Model { protected $strict = false; }
然後,下面的程式碼
$user = User::find(); echo $user->nick_name; $user->nick_name = 'test'; $user->save();
和下面的用法是等效的
$user = User::find(); echo $user->nickName; $user->nickName = 'test'; $user->save();
如果你的資料表字段不符合規範(存在大小寫混合使用的情況),那麼必須在模型中開啟strict
屬性。
增加樂觀鎖功能
和軟刪除一樣,增加了一個think\model\concern\OptimLock
Trait用於方便引入擴充套件模型的樂觀鎖功能。
<?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
方法替代之前的靜態get
方法。
增加閉包資料的快取序列化支援
添加了opis/closure
依賴用於支援閉包的序列化支援。
增加自動多應用支援
支援在同一個入口檔案中訪問多個應用,並且支援應用的對映關係以及自定義。
例如在index.php
入口檔案中使用:
(new App())->autoMulti()->run()->send();
就可以不必建立入口檔案自動通過URL訪問多個應用
http://serverName/index.php/admin
如果你的預設應用不是index
(預設為入口檔名),那麼可以通過name
方法指定預設應用。
(new App())->autoMulti() ->name('admin') ->run() ->send();
支援應用名的別名對映,例如:
(new App())->autoMulti([ 'think'=>'admin',// 把admin應用對映為think ])->run()->send();
如果需要對某個應用進行自定義,可以使用
(new App())->autoMulti([ 'admin'=>function($app) { $app->debug(true)->useClassSuffix(); } ])->run()->send();
取消別名路由
因為使用場景有限和效能開銷問題,取消原來的別名路由功能,建議使用資源路由或者單獨的路由替代。
取消快捷路由
因為使用場景有限和不太符合規範,取消了原來的控制器快捷路由功能。
取消空操作功能
建議使用分組MISS路由功能替代。
應用類庫字尾規範
取消了controller_suffix
和class_suffix
配置引數,App類增加了controllerSuffix
方法用於開啟控制器類庫的Controller
字尾(預設不開啟)。其它應用類庫的字尾由專案自己決定,框架不再強制規範。
需要注意的是,如果你的模型類命名使用了Model
字尾的話,一定要定義name
屬性或者table
屬性。
異常響應輸出型別
增加exception_response_type
配置引數用於設定異常響應輸出的型別,預設為html
型別。如果你的應用全部用於介面開發,可以配置為json
型別。
更新日誌
路由
-
路由檢測作為
AppInit
事件響應獨立出App類,可配置事件定義檔案不使用路由功能 -
路由定義的方法簡化
option
和pattern
引數,統一使用方法進行路由引數和變數規則設定 -
取消別名路由和快捷路由功能
-
取消多級控制器的自動搜尋功能
-
路由分組不再支援陣列方式定義分鐘下面的路由規則
-
取消路由的
mergeExtraVars
方法和設定 -
提升路由變數替換的效能
-
判斷路由規則定義新增對請求型別的判斷
-
路由地址支援
Dispatch
物件
資料庫和模型
-
改進模型的資料型別強制轉換對
Expression
物件的支援 -
模型查詢統一返回物件 取消
findOrEmpty
方法 模型類增加isEmpty
方法 -
增加
raw
助手函式 -
修正
mysql
的regexp
查詢 -
改進聚合查詢方法的
field
引數支援Expression
-
where
方法支援傳入Query
物件 -
改進
Connection
類getRealSql
方法 -
Query類
cache
方法支援傳入CacheItem
類 -
Query類
find/select/cursor
方法不再支援閉包 -
模型增加
lazySave
方法 用於延遲自動儲存 -
統一模型資料的讀取和寫入,支援駝峰和下劃線自動智慧識別
-
取消資料庫的分表功能支援
-
改進
join
方法支援引數繫結 -
取消
setInc
/setDec
方法和setField
方法 -
模型增加
strict
屬性 支援開啟欄位區分大小寫 預設不區分,資料庫欄位強制使用小寫 -
取消查詢方法的
eq neq lt gt elt egt
等表示式 -
統一模型事件為使用模型事件觀察者 廢棄
event
方法註冊模型事件 -
增加
after_read
模型事件 -
增加
whereYear
/whereMonth
/whereDay
查詢方法 -
Query類
query
方法支援查詢快取 -
增加
procedure
方法用於指定是否為儲存過程呼叫 -
簡化
cursor
、query
和execute
方法引數 -
廢棄資料庫執行次數 合併到查詢次數
-
Connection類
getCursor
方法調整 取消relation
引數 -
取消一對一關聯的
setEagerlyType
方法 -
改進軟刪除
destory
方法重複執行事件的問題 -
修正多對多中間表的寫入
-
改進關聯模型的
save
方法 -
增加樂觀鎖
Trait
控制器
-
取消
ActionBegin
事件 -
改進控制器中介軟體執行
-
修正控制器名稱獲取
-
改進App類的
useClassSuffix
方法的預設值 -
取消
controller_suffix
配置,改用App類的controllerSuffix
方法設定 -
取消
url_controller_layer
配置,改用App類的controllerLayer
方法設定 -
取消
class_suffix
配置 -
取消
App
類的action
方法 -
取消
empty_controller
配置,改用App
類的emptyController
方法設定 -
取消空操作
快取
-
改進快取
CacheItem
類增加expire
和tag
方法支援 -
改進
CacheItem
類getExpire
方法 -
改進
CacheItem
的快取有效期處理 -
改進快取類的
remember
方法 -
FIX:當使用
complex
快取的時候,通過store
方法選擇驅動,提供給connect
的引數型別錯誤 -
改進Redis快取驅動的
tag
支援 -
改進
Redis
驅動 -
改進快取類 取消
xcache
驅動 -
改進快取標籤的獲取
-
增加快取序列化的閉包支援
驗證
-
改進
unique
驗證方法 -
改進驗證類的自定義驗證正則
-
驗證方法調整
-
增加
validate
助手函式
其它
-
改進
Cookie
類的setCookie
方法 -
App
類增加classBaseName
方法 -
改進
Url
生成的埠問題 -
修正
Request
類param
方法 -
語言檢測、路由檢查、請求快取功能獨立作為事件響應
-
Request
增加單獨的middleware
方法傳遞中介軟體變數 -
取消
App
類的log
方法 -
增加
exception_response_type
配置引數