ThinkPHP 发布 5.2 Beta3 版本

栏目: PHP · 发布时间: 5年前

内容简介:本次更新了大量的细节,进一步统一和精简了用法,并且新增了一些功能。在正式版发布之前,不建议用于正式项目,目前也还没有完善的文档和详细的测试。相比较

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

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

主要更新

相比较 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_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 配置参数


以上所述就是小编给大家介绍的《ThinkPHP 发布 5.2 Beta3 版本》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Grails权威指南

Grails权威指南

瑞切 / 张若飞 / 电子工业 / 2007-11 / 49.80元

《Grails权威指南》译自由Grails项目负责人Graeme Keith Rocher编写的《The Definitive Guide to Grails》,着重介绍了如何在Grails框架下使用Groovy语言进行敏捷的Web开发。本书详细讲解Grails开发的全部过程,包括项目构架、控制器与视图、与关系数据库之间的ORM映射,以及与Ajax和Java平台的无缝集成。同时该书也揭示了Grai......一起来看看 《Grails权威指南》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

随机密码生成器
随机密码生成器

多种字符组合密码

URL 编码/解码
URL 编码/解码

URL 编码/解码