Releases: top-think/think
V6.0.5
V6.0.4
主要更新:
新增
[新增] 多语言支持解析json文件
[新增] 增加app.url配置 用于命令行下构建request
[新增] 模型类增加convertNameToCamel属性,支持数据格式转为驼峰命名输出
[新增] Relation类增加getForeignKey和getLocalKey方法
修正
[修正] 修复规则为空的bug
[修正] 修正请求缓存中间件
[修正] 改进验证的append方法处理造成多次验证的情况
[修正] 改进资源路由对路由到类的支持
[修正] 修正重定向路由的传参
[修正] 调整http初始化位置 防止容器绑定自身造成死循环
[修正] 改进Redis驱动select参数处理
[修正] 改进多对多关联查询
优化
[优化] 优化session文件缓存 path获取
[优化] 改进路由参数检测
[优化] 改进路由参数获取和变量检查
[优化] 路由的请求缓存可以通过request_cache_key配置参数关闭 便于开发模式
[优化] 调整路由配置载入位置
[优化] 改进路由缓存指令 取消opis/closure依赖
[优化] 改进路由的额外参数检测
[优化] 改进Config类的has方法判断
[优化] 改进参数绑定对Null值的支持
[优化] 改进when条件查询的闭包处理
[优化] 改进一对一关联查询对order排序的支持
V6.0.3
本次更新包含一个调试模式的系统信息安全隐患修正,建议更新。
主要更新:
- 异常提取
session
数据时先判断是否使用了session
- 修正文件上传类
- 取消
Event
类withEvent
方法 FileResponse
支持是否强制下载设置Request
对象支持ArrayAccess
接口- 日志的时间记录增加微秒数据支持
- 调整
Validate
场景执行优先级 - 优化App类
getDefaultRootPath
方法 - 修正全局中间件获取
param
参数的BUG - clear命令支持多层级目录
- 修正日志记录时区问题
- 修复助手函数
public_path
- 中间件支持多个参数
- 路由检测严格按照路由定义的顺序执行
FileResponse
增加是否强制下载文件选项- 修复自定义命令别名比系统别名长导致报错问题
- 改进路由到视图的变量传递
- 允许路由到一个自定义调度类
- 完善路由单元测试
- 默认路由也支持自动
OPTIONS
请求 - 改进路由调度
- 改进host和port的获取支持代理
Request->port
的返回类型转化- 改进模型生成模板
- 简化默认异常页面信息显示
- 数据库支持设置缓存store
- 改进
optimize:schema
指令 - 为清理指令添加仅删除过期文件的选项
- 请求缓存增加预检缓存配置 默认有效期1800秒
- 支持
header
方式自动侦测多语言
V6.0.2
V6.0.1
主要更新:
- 完善
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.40
V5.1.39
本次更新为常规更新,主要包括:
- 修正
memcached
驱动 - 改进
HasManyThrough
关联查询 - 改进
Request
类isJson
方法 - 改进关联查询
- 改进
redis
驱动 - 增加 Model类
getWhere
方法对复合主键的支持 - 改进
newQuery
方法 - 改进闭包查询的参数绑定
- 修正
Validate
- 修复某些情况下URL会多一个冒号
- 调整composer.json
- 修复使用
Cache::clear()
时,报错缓存文件不存在问题 - 使用File类的unlink方法进行文件删除
- 改进
paraseData
方法 - 修正image验证方法
- 改进Url生成
- 改进空操作对数字的支持
- 改进一处PHP7.4兼容性问题
V6.0.0
官方历时一年多倾力打造的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
扩展同时支持HTTP
和Socket
服务,支持数据库和缓存的连接池功能,以及RPC
功能。
调试工具更新
原来内置的页面Trace调试工具已经更改为扩展的方式,改成安装think-trace
扩展,如果通过composer安装应用的话,默认会安装topthink/think-trace
扩展。
基本用法和之前保持不变,但无需额外配置,默认使用html
方式显示,同时仍然支持浏览器控制台显示,并仅在调试模式下有效。
同时增加了一个基于debugbar
的调试扩展think-debugbar
,需要单独安装后才能使用。
composer require topthink/think-debugbar
统一和精简大量用法
新版对很多用法进行了精简和统一,尽可能避免在开发过程中规范不一的困惑。
开发手册
更多内容可以查看官方的完全开发手册。
V6.0.0RC5
主要更新如下:
多应用模式调整
鉴于多应用模式的复杂性和扩展性考虑,最新版本把多应用模式独立为框架的一个全局中间件扩展。默认安装后核心框架为单应用模式,如果需要使用多应用模式,可以安装
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
V5.1.38
本次更新为常规更新,主要包括:
Request
类增加isJson
方法- 改进浮点型查询
- 修正关联查询关联外键为空的查询错误
- 远程一对多支持关联统计和预载入查询
- 远程一对多关联支持
has
/hasWhere
查询 - 优化
parseIn
解析 - 改进
parseLike
查询 - 改进Url生成
- 改进模型的
toArray
方法 - 修正
notIn
查询 - 改进
JSON
字段查询 - 改进Controller类
display
/fetch
方法返回ViewResponse
对象 - 改进
param
方法 - 改进
mysql
驱动getExplain
方法 - 改进时间查询
- 改进模型关联的
has
/hasWhere
方法对软删除的支持