您当前位置: 南顺网络>> 官方资讯>> 行业动态

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\OptimLockTrait用于方便引入扩展模型的乐观锁功能。

<?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_suffixclass_suffix配置参数,App类增加了controllerSuffix方法用于开启控制器类库的Controller后缀(默认不开启)。其它应用类库的后缀由项目自己决定,框架不再强制规范。

需要注意的是,如果你的模型类命名使用了Model后缀的话,一定要定义name属性或者table属性。

异常响应输出类型

增加exception_response_type配置参数用于设置异常响应输出的类型,默认为html类型。如果你的应用全部用于接口开发,可以配置为json类型。

更新日志

路由

  • 路由检测作为AppInit事件响应独立出App类,可配置事件定义文件不使用路由功能

  • 路由定义的方法简化optionpattern参数,统一使用方法进行路由参数和变量规则设置

  • 取消别名路由和快捷路由功能

  • 取消多级控制器的自动搜索功能

  • 路由分组不再支持数组方式定义分钟下面的路由规则

  • 取消路由的mergeExtraVars方法和设置

  • 提升路由变量替换的性能

  • 判断路由规则定义添加对请求类型的判断

  • 路由地址支持Dispatch对象

数据库和模型

  • 改进模型的数据类型强制转换对Expression对象的支持

  • 模型查询统一返回对象 取消findOrEmpty方法 模型类增加isEmpty方法

  • 增加raw助手函数

  • 修正mysqlregexp查询

  • 改进聚合查询方法的field参数支持Expression

  • where方法支持传入Query对象

  • 改进ConnectiongetRealSql方法

  • 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方法用于指定是否为存储过程调用

  • 简化cursorqueryexecute方法参数

  • 废弃数据库执行次数 合并到查询次数

  • 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类增加expiretag方法支持

  • 改进CacheItemgetExpire方法

  • 改进CacheItem的缓存有效期处理

  • 改进缓存类的remember方法

  • FIX:当使用complex缓存的时候,通过store方法选择驱动,提供给connect的参数类型错误

  • 改进Redis缓存驱动的tag支持

  • 改进Redis驱动

  • 改进缓存类 取消xcache驱动

  • 改进缓存标签的获取

  • 增加缓存序列化的闭包支持

验证

  • 改进unique验证方法

  • 改进验证类的自定义验证正则

  • 验证方法调整

  • 增加validate助手函数

其它

  • 改进Cookie类的setCookie方法

  • App类增加classBaseName方法

  • 改进Url生成的端口问题

  • 修正Requestparam方法

  • 语言检测、路由检查、请求缓存功能独立作为事件响应

  • Request增加单独的middleware方法传递中间件变量

  • 取消App类的log方法

  • 增加exception_response_type配置参数

本次更新了大量的细节,进一步统一和精简了用法,并且新增了一些功能。

在正式版发布之前,不建议用于正式项目,目前也还没有完善的文档和详细的测试。

主要更新

相比较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\OptimLockTrait用于方便引入扩展模型的乐观锁功能。

<?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_suffixclass_suffix配置参数,App类增加了controllerSuffix方法用于开启控制器类库的Controller后缀(默认不开启)。其它应用类库的后缀由项目自己决定,框架不再强制规范。

需要注意的是,如果你的模型类命名使用了Model后缀的话,一定要定义name属性或者table属性。

异常响应输出类型

增加exception_response_type配置参数用于设置异常响应输出的类型,默认为html类型。如果你的应用全部用于接口开发,可以配置为json类型。

更新日志

路由

  • 路由检测作为AppInit事件响应独立出App类,可配置事件定义文件不使用路由功能

  • 路由定义的方法简化optionpattern参数,统一使用方法进行路由参数和变量规则设置

  • 取消别名路由和快捷路由功能

  • 取消多级控制器的自动搜索功能

  • 路由分组不再支持数组方式定义分钟下面的路由规则

  • 取消路由的mergeExtraVars方法和设置

  • 提升路由变量替换的性能

  • 判断路由规则定义添加对请求类型的判断

  • 路由地址支持Dispatch对象

数据库和模型

  • 改进模型的数据类型强制转换对Expression对象的支持

  • 模型查询统一返回对象 取消findOrEmpty方法 模型类增加isEmpty方法

  • 增加raw助手函数

  • 修正mysqlregexp查询

  • 改进聚合查询方法的field参数支持Expression

  • where方法支持传入Query对象

  • 改进ConnectiongetRealSql方法

  • 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方法用于指定是否为存储过程调用

  • 简化cursorqueryexecute方法参数

  • 废弃数据库执行次数 合并到查询次数

  • 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类增加expiretag方法支持

  • 改进CacheItemgetExpire方法

  • 改进CacheItem的缓存有效期处理

  • 改进缓存类的remember方法

  • FIX:当使用complex缓存的时候,通过store方法选择驱动,提供给connect的参数类型错误

  • 改进Redis缓存驱动的tag支持

  • 改进Redis驱动

  • 改进缓存类 取消xcache驱动

  • 改进缓存标签的获取

  • 增加缓存序列化的闭包支持

验证

  • 改进unique验证方法

  • 改进验证类的自定义验证正则

  • 验证方法调整

  • 增加validate助手函数

其它

  • 改进Cookie类的setCookie方法

  • App类增加classBaseName方法

  • 改进Url生成的端口问题

  • 修正Requestparam方法

  • 语言检测、路由检查、请求缓存功能独立作为事件响应

  • Request增加单独的middleware方法传递中间件变量

  • 取消App类的log方法

  • 增加exception_response_type配置参数

文章转载自 开源中国社区 [http://www.oschina.net]

编辑:--谢崇斌

填写您的服务需求,项目经理一对一为您服务!