ThinkPHP 发布 5.2 Beta3 版本

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

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

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

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

主要更新

相比较 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 版本》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

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

Web Data Mining

Web Data Mining

Bing Liu / Springer / 2011-6-26 / CAD 61.50

Web mining aims to discover useful information and knowledge from Web hyperlinks, page contents, and usage data. Although Web mining uses many conventional data mining techniques, it is not purely an ......一起来看看 《Web Data Mining》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具