您當前位置: 南順網絡>> 官方資訊>> 行業動态

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參數支持Expression

  • where方法支持傳入Query對象

  • 改進ConnectiongetRealSql方法

  • 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)存儲過程調用

  • 簡化cursorquery和(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方法支持

  • 改進CacheItemgetExpire方法

  • 改進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)端口問題

  • 修正Requestparam方法

  • 語言檢測、路由檢查、請求緩存功能獨立作為(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參數支持Expression

  • where方法支持傳入Query對象

  • 改進ConnectiongetRealSql方法

  • 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)存儲過程調用

  • 簡化cursorquery和(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方法支持

  • 改進CacheItemgetExpire方法

  • 改進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)端口問題

  • 修正Requestparam方法

  • 語言檢測、路由檢查、請求緩存功能獨立作為(wèi)事件響應

  • Request增加單獨的(de)middleware方法傳遞中間件變量

  • 取消App類的(de)log方法

  • 增加exception_response_type配置參數

文章(zhāng)轉載自(zì) 開源中國社區 [http://www.oschina.net]

編輯:--ns868