Think Versions Save

ThinkPHP Framework ——十年匠心的高性能PHP框架

v5.1.40

3 years ago

改进redis驱动has方法 修正XA事务 修正HasManyThrough关联 增加mysql json类型字段->>方式获取支持 改进路由加载 避免加载编辑器临时文件影响 修复关联模型的属性直接附加到当前模型,当关联模型字段名为name时获取的值为模型的属性name值 修复多态关联预加载field无效 改进Collection类的column方法的PHP兼容性问题 改进mysql驱动 改进parseclosure方法 SoftDelete删除条件做空判断 改进验证类append方法

v6.0.4

3 years ago

主要更新:

新增

[新增] 多语言支持解析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

3 years ago

本次更新包含一个调试模式的系统信息安全隐患修正,建议更新。

主要更新:

  • 异常提取session数据时先判断是否使用了session
  • 修正文件上传类
  • 取消EventwithEvent方法
  • 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

4 years ago

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

主要更新:

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

v6.0.1

4 years ago

主要更新:

  • 完善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

4 years ago

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

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

v6.0.0

4 years ago

官方历时一年多倾力打造的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.0-rc5

4 years ago

主要更新如下:

多应用模式调整

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

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

4 years ago

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

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

v6.0.0-rc4

4 years ago

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配置改为通过静态方法设置当前执行用户