Skip to content

Releases: top-think/framework

V6.0.2

13 Jan 05:49
Compare
Choose a tag to compare

本次更新包含一个可能的Session安全隐患修正,建议更新。

主要更新:

  • 改进设置方法后缀后的操作名获取问题
  • 修正optimize:schema指令
  • 修正Request类inputData处理
  • 改进中间件方法支持多个参数
  • 修正sessionid检查的一处隐患
  • 完善对15位身份证号码的校验
  • 增加远程多对多关联支持
  • 增加MongoDb的事务支持(mongodb版本V4.0+)
  • 改进insertAllreplace支持

V6.0.1

24 Dec 08:00
Compare
Choose a tag to compare

主要更新:

  • 完善Request::withInput
  • 修正Content-Type获取途径
  • 改进 SocketLog 驱动
  • 修正 ClientArg 获取途径
  • 修复FileResponse的cookie空对象异常
  • 支持渲染完整的异常链信息
  • 异常页面支持折叠调用堆栈信息
  • 改进异常响应时内容的一致性
  • 改进Error控制器对数字访问的支持
  • 修正redirect助手函数
  • memcached delete 支持 timeout
  • 修正redis驱动
  • 改进memcache驱动
  • 改进容器类invokeMethod方法
  • 使用新的数组语法替代list
  • 缓存默认的序列化方法改为serialize/unserialize
  • Add Cookie SameSite(PHP>7.3)
  • 扩展Socket驱动
  • 修正异常页面的模板文件
  • 事件监听去重
  • 取消视图日志
  • 修正验证jpg结尾的图片报错问题
  • 改进Url生成
  • 改进Url生成伪静态后缀设置false的情况
  • 改进File类型session读取gzcompress问题
  • 修复使用路由验证后路由变量丢失的问题
  • 修正多应用下路由目录路径
  • 修复 expand_level 选项异常
  • 改进Cache类remember方法对依赖注入的支持
  • 防止因日志配置异常时陷入死循环
  • 模型支持动态设置数据库连接
  • 修正column方法的查询缓存问题
  • 改进Query类的getAutoInc方法
  • 改进模型更新条件获取
  • 修正使用模型对象更改数据时忽略自定义的suffix connection参数
  • 修正XA事务
  • 规范column方法的查询

V5.1.39

17 Nov 23:24
Compare
Choose a tag to compare

本次更新为常规更新,主要包括:

  • 修正memcached驱动
  • 改进HasManyThrough关联查询
  • 改进RequestisJson方法
  • 改进关联查询
  • 改进redis驱动
  • 增加 Model类getWhere方法对复合主键的支持
  • 改进newQuery方法
  • 改进闭包查询的参数绑定
  • 修正Validate
  • 修复某些情况下URL会多一个冒号
  • 调整composer.json
  • 修复使用Cache::clear()时,报错缓存文件不存在问题
  • 使用File类的unlink方法进行文件删除
  • 改进paraseData方法
  • 修正image验证方法
  • 改进Url生成
  • 改进空操作对数字的支持
  • 改进一处PHP7.4兼容性问题

V6.0.0

24 Oct 02:06
Compare
Choose a tag to compare

官方历时一年多倾力打造的ThinkPHP6.0版本正式发布,该版本基于精简核心和统一用法两大原则在5.1的基础上对底层架构做了进一步的优化改进,并更加规范化。

由于引入了一些新特性,ThinkPHP6.0运行环境要求PHP7.1+(推荐PHP7.3+),不支持5.1的无缝升级(官方提供了升级指导)。

主要特性:

  • 采用PHP7强类型(严格模式)
  • 支持更多的PSR规范
  • 多应用支持
  • ORM组件独立
  • 改进的中间件机制
  • 核心架构服务化
  • 全新的事件系统
  • 容器功能增强
  • 模板引擎组件独立
  • 内部功能中间件化
  • SESSION机制改进
  • 缓存及日志支持多通道
  • 引入Filesystem组件
  • Swoole以及协程支持改进
  • 对IDE更加友好
  • 统一和精简大量用法

强类型及严格模式

在主流框架里面,ThinkPHP6.0是最先采用PHP7严格模式的。所有的核心文件都是开启了严格模式的类型约束,因此有任何的变量类型不符的情况都会抛出异常,有利于规范代码中的变量类型和提前发现问题隐患。

多应用模式

新版框架提供了多应用模式支持,默认安装为单应用,你只需要安装一个多应用模式扩展就可以更轻松的部署多个应用而不需要重复安装依赖组件,每个应用都支持独立入口访问以及域名绑定,也可以使用一个入口文件实现自动多应用部署。并且自动多应用模式支持智能识别,对于不存在的应用访问会自动切换到单应用模式进行匹配。同时支持应用的映射和禁止访问机制。

多应用模式的设计可以让开发更加模块化,因为每个应用的配置、路由及视图都可以纳入应用目录,所以更方便应用的模块化,甚至引入composer应用。

容器和服务

新版的容器支持PSR-11规范,容器类的功能特性主要包括:

  • 绑定类、对象实例、接口到容器
  • 创建类的实例(存在则直接获取)
  • 容器对象绑定别名
  • 支持容器对象(实例化)回调
  • 获取容器对象实例
  • 删除容器中的对象实例
  • 提供依赖注入和门面实现支持
  • 调用容器对象实例的方法(或者闭包)
  • 提供容器对象的ArrayAccess支持

事件系统

新版的事件系统可以看成是5.1版本行为系统的升级版,事件系统相比行为系统强大的地方在于事件本身可以是一个类,并且可以更好的支持事件订阅者。支持事件智能订阅,通过反射机制来识别当前订阅者要订阅的事件。

事件相比较中间件的优势是事件比中间件更加精准定位(或者说粒度更细),并且更适合一些业务场景的扩展。例如,我们通常会遇到用户注册或者登录后需要做一系列操作,通过事件系统可以做到不侵入原有代码完成登录的操作扩展,降低系统的耦合性的同时,也降低了BUG的可能性。

中间件支持完善

中间件分为全局中间件、应用中间件、路由中间件和控制器中间件,这四个中间件分组完全独立执行,但同一个分组内的中间件不会重复执行。中间件方法执行依赖注入,以及请求结束的回调机制。

核心很多功能都是基于中间件来完成,包括多应用模式也是采用中间件机制执行。

路由和请求

新版的路由精简了很多不必要的功能,路由定义也更加规范化和语义化,并且路由定义文件支持纳入应用目录,便于模块化开发。路由注解功能独立为think-annotation库,并且使用更加规范,支持IDE提示。

新版的请求对象更易扩展,系统默认安装后提供了一个app\Request类,你可以在应用中直接自定义请求对象,增加必要的属性和方法。但不会影响对think\Request的依赖注入和门面调用。

系统服务

由于核心框架采用了服务化设计,你可以在你的扩展或者应用中注册需要的服务。在系统服务中注册一个对象到容器,或者对某些对象进行相关的依赖注入。由于系统服务的执行优先级问题,可以确保相关组件在执行的时候已经完成相关依赖注入。一个服务类通常包括注册(register)和启动(boot)方法,用于不同阶段的执行。

ORM组件化

内置的ORM功能已经完全独立为think-orm组件,可以独立使用,ThinkPHP6.0默认依赖安装了该组件,保持用法不变的同时,增强了查询功能。

模板引擎组件化

核心不再内置任何模板引擎,仅提供PHP模板支持,官方的模板引擎已经独立为think-template模板引擎,并默认依赖安装。你可以更方便的使用第三方模板引擎。

日志系统

日志支持多通道、并统一命令行和WEB日志格式,主要包括:

  • 日志增加多通道支持,可以同时或者切换写入多个通道
  • WEB和CLI的日志记录格式统一,并支持日志格式化
  • 对JSON日志格式的改进
  • 支持日志写入事件

Session机制改进

6.0版本的Session机制完全重写了,并且不再使用PHP内置的Session机制,全新实现一套Session机制,可以更好的支持Swoole/Workerman等环境。

所以不再支持PHP内置的session_*** 系列函数,也不再支持使用$_SESSION读取session数据,你必须通过框架提供的Session类或者门面来操作,Request类也封装了Session数据的读取。

Session支持跨应用读取和自定义序列化机制,默认采用文件类型记录Session数据,由于共用了缓存机制,你还可以使用任何支持的缓存类型来记录Session数据。

引入Filesystem组件

新版增加了Filesystem类库对文件系统强化了支持,而且可以很方便的支持各种云存储,包括阿里云和七牛云。

Swoole扩展改进

Swoole扩展同时支持HTTPSocket服务,支持数据库和缓存的连接池功能,以及RPC功能。

调试工具更新

原来内置的页面Trace调试工具已经更改为扩展的方式,改成安装think-trace扩展,如果通过composer安装应用的话,默认会安装topthink/think-trace扩展。

基本用法和之前保持不变,但无需额外配置,默认使用html方式显示,同时仍然支持浏览器控制台显示,并仅在调试模式下有效。

同时增加了一个基于debugbar的调试扩展think-debugbar,需要单独安装后才能使用。

composer require topthink/think-debugbar

统一和精简大量用法

新版对很多用法进行了精简和统一,尽可能避免在开发过程中规范不一的困惑。

开发手册

更多内容可以查看官方的完全开发手册

V6.0.0RC5

14 Oct 03:01
Compare
Choose a tag to compare
V6.0.0RC5 Pre-release
Pre-release

主要更新包括:

多应用模式调整

鉴于多应用模式的复杂性和扩展性考虑,最新版本把多应用模式独立为框架的一个全局中间件扩展。默认安装后核心框架为单应用模式,如果需要使用多应用模式,可以安装

composer require topthink/think-multi-app

安装后会自动注册一个全局中间件并优先执行,就可以自动支持多应用模式,无需做任何的配置调整。如果需要进行应用映射或者域名绑定的话,仍然设置app_map以及domain_bind即可。

如果你的入口文件是index.php的话,会自动开启自动多应用模式。如果你的入口文件是其它,例如admin.php或者api.php则会自动绑定admin或者api应用,当然,如果你在入口文件中已经使用name方法绑定了应用,则优先。

另外,如果是自动多应用模式下,URL里面的应用不存在,会自动处理为单应用解析,也就是说多应用和单应用是可以在新版的架构下共存。举个例子,当我们访问下面的URL:

http://tp.com/think

假设think应用并不存在(也没有定义任何的应用映射),当我们访问上面的地址的时候会自动进行单应用解析,也就是说如果有定义全局路由(例如route/route.php)的话

Route::get('think', function () {
    return 'hello,ThinkPHP!';
});

页面会输出

hello,ThinkPHP!

这样设计的初衷是为了更加方便扩展注册全局路由,避免在开启多应用模式的情况下注册的全局路由失效(比如之前的验证码扩展只能用于单应用模式,多应用模式需要单独注册路由)。

如果你完全不需要单应用模式,也可以设置使用严格的多应用模式

'app_express'    =>    true,
'default_app'    =>    'home',

当我们再次访问

http://tp.com/think

的时候,其实是访问默认(home)应用的think路由。

中间件机制改进

由于多应用扩展独立后,中间件机制也随之进行了一些优化和调整,现在中间件大致分为四个组,包括全局中间件、应用中间件、路由中间件和控制器中间件,每个中间件组彼此独立按顺序运行。

app/middleware.php文件里面定义的中间件即为全局中间件,执行优先级最高(相对于前置中间件而言),如果使用了多应用模式,并且在应用目录下也定义了middleware.php文件,即为应用中间件,执行优先级仅次于全局中间件。

如果在路由注册的时候定义了中间件即为路由中间件,注意,在路由中间件执行之前是获取不到当前应用的控制器和操作名的(所以,全局中间件和应用中间件执行的过程中是无法获取控制器和操作名的),如果你不想在路由注册的时候定义中间件,还有一个额外的办法,就是在路由配置文件(包括全局路由配置和应用路由配置)中定义middleware参数,无论是否匹配路由都会执行,类似于全局路由中间件的概念。

'middleware'    =>    [
    app\middleware\Auth::class,
    app\middleware\Check::class,
],

中间件调度优化

中间件的执行流程改进,think\middleware仅仅负责中间件的管理和调度,增加think\Pipeline类负责中间件的执行。并支持控制中间件的执行顺序。中间件配置文件的格式做了一些调整,除了定义中间件别名外,增加了执行优先级设置。

return [
    // 别名或分组
    'alias'    => [
    ],
    // 优先级设置,此数组中的中间件会按照数组中的顺序优先执行
    'priority' => [
    ],
];

中间件end回调

中间件增加end回调,如果在中间件类中有定义end方法,则会在请求结束后统一调用。

public function end(Response $response)
{
}

中间件执行去重

对于每个分组的中间件,会进行强制去重操作,也就是说在一个分组中的中间件只可能执行一次。

模板目录自动识别

模板目录无需再进行任何的配置,取消了view_base配置,改为自动识别,应用目录下的view目录优先,如果不存在,则会使用应用根目录下的view目录。如果要单独定义某个应用的模板目录,则使用view_path配置参数定义即可。

事件智能订阅改进

事件智能订阅的时候不再需要事先注册和定义事件,采用反射机制自动识别订阅事件。

应用名获取调整

多应用模式改成扩展后,核心已经完全解耦了多应用相关的方法和属性,所以如果你需要获取当前的应用名,需要改成

app('http')->getName();

对于使用中间件进行权限控制用途的,官方的建议是采用pathinfo地址进行权限判断。

think-swoole扩展更新

think-swoole扩展也在持续更新和完善,现在已经支持数据库和缓存的连接池功能,以及RPC功能。

调试工具更新

原来内置的页面Trace调试工具已经更改为扩展的方式,改成安装think-trace扩展,如果通过composer安装应用的话,默认会安装topthink/think-trace扩展,或者直接安装。

composer require topthink/think-trace

原核心内置的TraceDebug中间件不再使用,请在中间件定义文件中注释掉。

基本用法和之前保持不变,但无需额外配置,默认使用html方式显示,同时仍然支持浏览器控制台显示,并仅在调试模式下有效。

同时增加了一个基于debugbar的调试扩展think-debugbar,需要单独安装后才能使用。

composer require topthink/think-debugbar

V6.0.0RC4

16 Aug 08:11
Compare
Choose a tag to compare
V6.0.0RC4 Pre-release
Pre-release

RC4版本主要改进包括ORM库独立,日志系统增加多通道支持,缓存、日志、数据库的配置文件统一调整为多通道模式。

本次更新相对于RC3版本主要涉及配置文件的更新,其它调整参考更新日志的用法调整部分。

主要新特性

数据库和模型改为独立的think-orm

数据库和模型操作核心不再内置,改为统一依赖topthink/think-orm库(该类库已经包括其它的数据库驱动),用法保持一致,功能也没有任何的缺失。

此前think-orm库已经独立更新维护,但一直是同步核心的ORM,2.0版本进行了架构调整,保持独立性的同时支持框架依赖,以后数据库操作这块统一在此类库更新。

模型功能增强

对模型做了大量的功能改进,主要包括:

  • 关联类增加withFieldwithLimit方法
  • 改进模型的hasWhere方法对闭包查询条件的支持完善
  • 支持has/hasWhere的多次调用
  • 模型的has/hasWhere方法支持软删除
  • 增加远程一对一关联
  • 远程一对一和一对多支持预载入及has/hasWhere查询
  • 模型类支持序列化及缓存操作
  • 关联预载入查询支持缓存
  • 模型方法支持依赖注入
  • 模型事件改进支持系统事件系统

日志支持多通道、并统一命令行和WEB日志格式

此次更新对日志类做了较大的调整和增强,主要包括:

  • 日志增加多通道支持,可以同时或者切换写入多个通道
  • WEB和CLI的日志记录格式统一,并支持日志格式化
  • 对JSON日志格式的改进
  • 支持日志写入事件

增加Filesystem组件

Filesystem组件用以替代之前的上传类,提供了更多上传到远端的扩展库支持。

容器对象增加回调机制

容器中的对象实例化之后,引入回调机制,利用该机制可以实现诸如注解功能等相关功能。

你可以通过resolving方法注册一个全局回调

Container::getInstance()->resolving(function($instance,$container) {
    // ...
});

回调方法支持两个参数,第一个参数是容器对象实例,第二个参数是容器实例本身。

或者单独注册一个某个容器对象的回调

Container::getInstance()->resolving(\think\Cache::class,function($instance,$container) {
    // ...
});

路由注解独立为think-annotation

路由注解功能独立为think-annotation库,并且使用更加规范,支持IDE提示。

多应用模式下路由定义支持纳入应用目录

在多应用模式下,路由定义文件支持放入应用目录的route目录下。

模板根目录默认放入根目录下的view目录

模板根目录默认从应用目录下移动到根目录的view目录,如果是多应用模式的话,下面是应用子目录,如果你需要改回放入原先的应用目录下,可以在应用的template配置文件中定义view_path

'view_path'    =>    app_path('view'),

更新日志

功能改进

  • 改进路由类的配置读取
  • 改进parseLike查询
  • 改进ViewResponse类增加内容渲染输出支持
  • 增加display助手函数
  • 验证类maker方法支持注入扩展验证规则
  • 改进事件触发的对象传入
  • 改进Console/Table
  • 改进关联定义对查询构造器的支持
  • 关联类增加withFieldwithLimit方法,并取消QuerywithField方法
  • 增加延迟关联查询对withLimit的支持
  • 改进模型toArray方法
  • 改进Url生成的域名参数
  • 改进 make:command指令生成
  • 缓存有效期支持DateInterval
  • 改进Query类find方法
  • 改进json查询
  • 改进查询缓存
  • 增加filesystem组件
  • 改进跨域请求
  • 改进路由检测缓存配置
  • 改进注解路由的文件写入
  • 路由注册支持注册options请求类型
  • 改进重定向路由检测
  • 改进模型的hasWhere方法对闭包查询条件的支持完善
  • 增加time_query_rule数据库配置参数 用于自定义时间查询规则
  • 改进时间字段类型的自动识别
  • 改进redis驱动
  • 容器对象增加invoke回调机制
  • 改进多对多关联
  • 资源路由增加withModelwithValidate 对各个路由设置不同的模型绑定和验证
  • 改进getLastInsID方法
  • 日志类调整 支持多通道写入
  • 改进模型输出
  • 支持单独关闭某个通道的日志写入
  • 取消部署模式下 不写入调试日志的功能 用调试级别设置单独的日志渠道来替代
  • 改进日志记录格式
  • 支持日志输出格式化
  • 改进资源路由
  • 改进命令行日志实时写入
  • 日志通道支持单独设置level配置参数
  • Log类调整优化
  • 增加paginateX查询用于大数据分页查询
  • 数据集增加firstlast方法
  • 改进response/View类的assign方法
  • 改进请求参数获取问题
  • 改进pathinfo方法
  • 增加一些路径助手函数
  • 改进多级控制器访问
  • Log类支持__call方法
  • 多应用模式的路由定义支持放入单独的应用目录
  • 模型增加依赖注入支持
  • 改进模型事件
  • 改进页面Trace机制
  • 改进validate助手函数,支持设置验证失败后是否抛出异常
  • 改进容器bind方法
  • 改进Redis Session驱动
  • 改进日志记录的空行问题
  • 改进RedirectResponse
  • 改进缓存驱动
  • 改进think optimize:schema 指令
  • Url类增加https方法
  • 改进isPjax判断
  • 改进Db类配置获取

问题修正

  • 修正模型属性获取
  • 修正Request类的过滤功能
  • 修正subDomain方法
  • 修正input助手函数
  • 修正模型refresh方法
  • 修正关联统计不使用子查询的方式
  • 修正Request类root方法
  • 修正缓存有效期处理
  • 修正MorphTo关联
  • 修正缓存标签
  • 修正mysql驱动insert方法
  • 修正Db类connect方法
  • 修正allowCrossDomain方法
  • 修正Query类chunk方法
  • 修正分组跨域
  • 修正关联预载入查询
  • 修正时间字段写入
  • 修正验证类checkSize
  • 修正多对多关联闭包
  • 修正RuleName类setRule方法
  • 修正whereTime查询
  • 修正request助手函数
  • 修正日志关闭配置
  • 修复对多字节字符的兼容性

用法调整

  • 模型切换后缀方法switch更改为suffix
  • 关联定义仅支持查询类的方法
  • 取消Query类的fetchArray方法
  • select查询方法默认返回数据集对象
  • 取消optimize:config指令
  • 调整数据库和缓存配置文件格式 默认采用多类型支持 方便切换
  • Cache类的initconnect方法取消 并入store方法
  • cache助手函数取消初始化用法
  • cache助手函数留空返回Cache对象
  • 默认时间字段类型改为timestamp
  • 注解路由移出核心,注解相关功能使用topthink/think-annotation
  • 改进路由 取消url_convert配置参数
  • 取消route:build指令
  • 调整默认模板目录为根目录view
  • 取消默认的请求日志记录 在项目里面自己添加
  • 统一find查询必须使用查询条件
  • 扩展的service配置文件默认放到vendor目录下
  • 废除LogLevel事件
  • 取消App类的序列化方法
  • 控制台的user配置改为通过静态方法设置当前执行用户

V5.1.38.1

12 Aug 00:59
Compare
Choose a tag to compare
  • 修正widget助手函数
  • 修正视图过滤方法

V5.1.38

08 Aug 04:24
Compare
Choose a tag to compare

本次更新为常规更新,主要包括:

  • Request类增加isJson方法
  • 改进浮点型查询
  • 修正关联查询关联外键为空的查询错误
  • 远程一对多支持关联统计和预载入查询
  • 远程一对多关联支持has/hasWhere查询
  • 优化parseIn解析
  • 改进parseLike查询
  • 改进Url生成
  • 改进模型的toArray方法
  • 修正notIn查询
  • 改进JSON字段查询
  • 改进Controller类display/fetch方法返回ViewResponse对象
  • 改进param方法
  • 改进mysql驱动getExplain方法
  • 改进时间查询
  • 改进模型关联的has/hasWhere方法对软删除的支持

V6.0.0RC3

02 Jun 22:49
Compare
Choose a tag to compare
V6.0.0RC3 Pre-release
Pre-release

RC3版本主要改进和优化了系统内置中间件,改进了一些用法和体验,并且把不常用的驱动移出核心改为扩展方式提供。

主要新特性

增加whereWeek日期查询

// 查询本周文章
Article::whereWeek('create_time')->select();
// 查询上周文章
Article::whereWeek('create_time', 'last week')->select();
// 查询2019-1-1到2019-1-7的文章
Article::whereWeek('create_time', '2019-1-1')->select();  

自增ID获取支持类型自动转换

自增ID获取的时候会根据主键的字段类型自动转换处理,而不是PDO默认返回的字符串类型。

当前请求记录匹配路由规则

记录当前请求的路由规则对象,可以通过

$request->rule();

获取当前请求实际匹配的路由规则对象

增加requireWithout验证规则

表示当某个字段没有数据的时候必须,可以组合完成表单中某两个字段必须填写一项的验证,例如:

'phone' => 'requireWithout:mobile',
'mobile'=> 'requireWithout:phone',

优化路由ext和name方法以及URL生成

增加项目自定义类

取消了内置的think\Controller控制器基类,在项目中提供了app\BaseController控制器基类更方便自定义。

另外项目还提供了app\Request自定义请求类,可以自定义应用所需的请求方法和属性。提供了app\ExceptionHandle自定义异常处理类
,方便对异常进行自定义接管处理。

URL生成使用对象方式操作

Route类buildUrlurl助手函数返回类型改为think\route\Url对象实例而不是字符串,由于定义了__toString方法,因此可以在模板中直接输出为URL字符串。

echo url('index/hello',['name'=>'think'])->suffix('htm')->domain('blog');

修改器改进

改进修改器方法支持不返回任何数据,而是在修改器中直接设置数据

例如:

class User extends \think\Model
{
	public function setField1Attr($value,$data){
		$this->set('field2', $data['field2']);
		$this->set('field3', $data['field3']);
	}	
}

$user = new User;
$user->field1 = 'value1';
$user->save();

实际写入数据库的时候不会包含field1字段数据,但会包含field2field3的数据。

dump/halt助手函数调整支持输出多个变量

你可以使用

dump($var1,$var2,...) 

方式输出多个变量调试,同样halt方法也可以支持调试多个变量输出并中止执行。

最新版本会在安装项目的时候安装symfony/var-dumper扩展替换内置的dump助手函数,因此你可以进行更强大的输出

关联自动更新

关联together方法自动更新和删除的时候可以无需使用with

例如,之前的写法

$article = Article::with('comments')->find(1);
$article->together(['comments'])->delete();

现在可以直接写成

$article = Article::find(1);
$article->together(['comments'])->delete();

模型数据集增加deleteupdate方法

可以批量对数据集进行更新和删除操作(支持模型事件)

// 更新今天的数据
$list = Article::whereDay('create_time')->select();
$list->update(['is_new'=>1]);

// 删除昨天的数据
$list = Article::whereDay('create_time', 'yesterday')->select();
$list->delete();

模型支持表后缀以及动态切换

<?php
namespace app\model;

use think\Model;

class Blog extends Model
{
    // 定义默认的表后缀(默认查询中文数据)
    protected $suffix = _cn';
}

模型提供了动态切换方法switchsetSuffix,例如:

// switch方法用于静态查询
Blog::switch('_en')->find();
// setSuffix用于动态设置
$blog = new Blog($data);
$blog->setSuffix('_en')->save();

注解路由支持给某个路由指定所属分组

在注解中定义路由分组,可以使用

<?php
namespace app\controller;

/**
 * @group('blog')
 */
class Blog
{
    /**
     * @param  string $name 数据名称
     * @return mixed
     * @route('hello/:name','get')
     */
	public function hello($name)
    {
    	return 'hello,'.$name;
    }
}

当前控制器中的注解路由会自动加入blog分组下面,最终,会注册一个blog/hello/:name的路由规则。你一样可以对该路由分组设置公共的参数,例如:

<?php
namespace app\controller;

/**
 * @group('blog')->ext('html')
 *   ->pattern(['id' => '\d+', 'name' => '\w+'])
 * 
 */
class Blog
{
    /**
     * @param  string $name 数据名称
     * @return mixed
     * @route('hello/:name','get')
     */
	public function hello($name)
    {
    	return 'hello,'.$name;
    }
}

如果你已经在路由定义文件中定义了blog分组,也可以直接把某个路由加入该分组,例如:

<?php
namespace app\controller;

class Blog
{
    /**
     * @param  string $name 数据名称
     * @return mixed
     * @route('hello/:name','get')->group('blog')
     */
	public function hello($name)
    {
    	return 'hello,'.$name;
    }
}

多语言支持分组定义

你可以在定义多语言的时候使用分组定义

return [
    'user'    =>    [
         'welcome'  => '欢迎回来',
         'login' => '用户登录',
         'logout' => '用户登出',
    ]
];

然后使用下面的方式获取多语言变量

Lang::get('user.login');
lang('user.login');

支持自定义加载语言文件

可以通过extend_list设置,例如:

'extend_list'    =>    [
    'zh-cn'    => [
        app()->getBasePath() . 'lang\zh-cn\app.php',
        app()->getBasePath() . 'lang\zh-cn\core.php',
    ],
]

便于在扩展中自定义语言包
,并且现在已经支持语言文件使用YML格式定义

缓存标签改进

增加TagSet类,tag方法支持传入数组,同时对多个标签进行操作

Cache::tag('tag')->set('name1','value1');
Cache::tag('tag')->set('name2','value2');

// 清除tag标签的缓存数据
Cache::tag('tag')->clear();

并支持同时指定多个缓存标签操作

Cache::tag(['tag1', 'tag2'])->set('name1', 'value1');
Cache::tag(['tag1', 'tag2'])->set('name2', 'value2');

// 清除多个标签的缓存数据
Cache::tag(['tag1','tag2'])->clear();

可以追加某个缓存到标签

Cache::tag('tag')->append('name3');

缓存类增加push方法

增加元素到一个数组缓存

Cache::set('name', [1,2,3]);
Cache::push('name', 4);
Cache::get('name'); // [1,2,3,4]

Cookie保存时间支持DateTimeInterface

增加表单令牌中间件

控制器支持__call方法

增加deny_app_list配置参数

可以配置禁止直接访问的应用列表

控制器中间件改进

控制器中间件的onlyexcept定义不区分大小写

app_map支持指定泛应用映射

可以在app_map配置中定义泛应用解析到指定应用,例如:

'app_map' => [
    'think'  =>  'admin',  // 把admin应用映射为think
   // ... 其它应用映射定义
    '*' => 'home', // 其它应用解析到home
],

问题修正

  • 修正参数绑定的浮点型精度问题
  • 修正软删除
  • 修正模型的数据库连接
  • 修正RedirectResponse
  • 修正Session类flush方法
  • 修正JSON字段参数绑定
  • 修正make:controller指令生成
  • 修正Cache类的get方法默认值
  • 修正域名绑定
  • 修正关联模型的动态获取器
  • 修正模型dateFormat属性方法
  • 修正url生成对多入口的支持
  • 修正ini配置文件格式的布尔值转换问题
  • 修正路由延迟解析全局配置无效的问题
  • 修正路由缓存问题
  • 修正关联update操作
  • 修正Relation::$selfRelation默认为null,导致Relation::isSelfRelation()方法报错
  • 修正redis缓存驱动
  • 修正事件智能订阅observe方法
  • 修正模型字段定义对日期查询无效的问题
  • 修正Console类getNamespaces方法
  • 修正where查询方法传入Query对象的时候缺少bind数据的问题
  • 修正request类method方法
  • 修正route:list指令
  • 修正Collectionload方法
  • 修正redis驱动的端口类型
  • 修正session数据序列化使用JSON处理的问题
  • 修正分组路由合并解析
  • 修正模型的hidden方法隐藏关联模型的问题
  • 修正关联查询关联键为空的错误
  • 修正返回204状态码的响应判断
  • 修正Requesthas方法对envsession的支持
  • 修正provider.php文件无效问题
  • 修正关联查询的部分问题
  • 修正validate助手函数支持指定验证器类
  • 修正验证类getValidateType方法
  • 修正入口单独开启调试模式
  • 修正加载Composer应用

用法调整

  • 页面trace中间件仅在调试模式有效
    ,并且无需设置环境变量
  • Socket日志驱动移出核心
  • PostgreSQLSqliteSqlServer驱动移出核心
    ,改为扩展
  • 取消内置think\Controller基类
  • Yaconf支持移出核心 纳入扩展think-yaconf
  • 字段排除改为withoutField方法
  • 取消useGlobalScope方法增加withoutGlobalScope方法
  • 更改默认生成的中间件位置
  • 加载默认语言包无需开启多语言中间件
  • Cookie类恢复gethas方法支持
  • token助手函数调整
  • 全局请求缓存参数调整
  • 统一中间件调用传参,不支持:分割传参
  • 缓存数据统一进行序列化后存储

废弃用法

  • 取消多语言的auto_detect配置
  • 取消session类的auto_start配置参数和boot方法
  • 废弃Where数组对象查询
  • 取消模型事件观察者
  • 取消JumpResponsesuccess/error/result等方法和助手函数
  • 取消表达式查询解析扩展及think\db\Expression
  • 废弃模型自动完成功能,使用模型事件替代
  • 取消cookieprefix参数
  • 取消一系列不推荐使用的助手函数
  • 取消optimize:facade optimize:model指令 改为扩展方式
  • 取消命令行执行URL
  • 删除Config__get__isset 方法

V5.1.37.1

30 May 03:49
Compare
Choose a tag to compare

修正5.1.37版本的已知问题