更新日志
最后更新于:2022-04-02 01:55:42
# 版本更新日志
[TOC=2,2]
## V5.1.41 LTS(2021-1-11)
本版本为PHP8兼容更新
## V5.1.40 LTS(2020-10-09)
本版本为常规更新,主要包括:
* 改进redis驱动`has`方法
* 修正XA事务
* 修正`HasManyThrough`关联
* 增加mysql json类型字段->>方式获取支持
* 改进路由加载 避免加载编辑器临时文件影响
* 修复关联模型的属性直接附加到当前模型,当关联模型字段名为name时获取的值为模型的属性name值
* 修复多态关联预加载`field`无效
* 改进Collection类的`column`方法的PHP兼容性问题
* 改进mysql驱动
* 改进`parseclosure`方法
* SoftDelete删除条件做空判断
* 改进验证类`append`方法
## V5.1.39 LTS(2019-11-18)
本次更新为常规更新,主要包括:
* 修正`memcached`驱动
* 改进`HasManyThrough`关联查询
* 改进`Request`类`isJson`方法
* 改进关联查询
* 改进`redis`驱动
* 增加 Model类`getWhere`方法对复合主键的支持
* 改进`newQuery`方法
* 改进闭包查询的参数绑定
* 修正`Validate
`
* 修复某些情况下URL会多一个冒号
* 调整composer.json
* 修复使用`Cache::clear()`时,报错缓存文件不存在问题
* 使用File类的unlink方法进行文件删除
* 改进`paraseData`方法
* 修正image验证方法
* 改进Url生成
* 改进空操作对数字的支持
* 改进一处PHP7.4兼容性问题
## V5.1.38.1 LTS (2019-8-12)
* 修正`widget`助手函数
* 修正视图类`filter`方法
## V5.1.38 LTS (2019-8-8)
本次更新为常规更新,主要包括:
* `Request`类增加`isJson`方法
* 改进浮点型查询
* 修正关联查询关联外键为空的查询错误
* 远程一对多支持关联统计和预载入查询
* 远程一对多关联支持`has`/`hasWhere`查询
* 优化`parseIn`解析
* 改进`parseLike`查询
* 改进Url生成
* 改进模型的`toArray`方法
* 修正`notIn`查询
* 改进`JSON`字段查询
* 改进Controller类`display`/`fetch`方法返回`ViewResponse`对象
* 改进`param`方法
* 改进`mysql`驱动`getExplain`方法
* 改进时间查询
* 改进模型关联的`has`/`hasWhere`方法对软删除的支持
## V5.1.37 LTS(2019-5-26)
本次更新为常规更新,主要更新如下:
* 改进关联数据更新
* 修正关联动态获取器
* 改进`redis`驱动
* 修复验证规则里面出现二维数组时的错误
* 改进跨域请求支持
* 完善模型`hidden`方法对关联属性的支持
* 改进`where`查询方法传入`Query`对象的支持`bind`数据
* 改进数据集对象的`load`方法
* 修正缓存类`clear`方法对`tag`的支持
## V5.1.36 LTS(2019-4-28)
本次更新为常规更新,主要更新如下:
* 修正`chunk`方法一处异常抛出的错误
* 修正模型输出的`visible
`
* 改进环境变量加载
* 改进命令行日志的`level`配置支持
* 修复设置有缓存前缀时,无法清空缓存标签的问题
* HasMony对象`saveAll`方法兼容`Collection`格式参数格式
* 修正`whereOr`查询使用字符串的问题
* 改进`dateFormat`设置
对写入数据的影响
* 修正查询缓存
* 记住指定的跳转地址
* 改进软删除
* 改进聚合查询
SQL去除limit 1
* 改进缓存驱动
## V5.1.35 LTS(2019-3-2)
本次更新为常规更新,修正了一些已知的问题。
* 修正验证类自定义验证方法多次执行的问题
* 模型增加`isEmpty`方法用于判断是否空模型
* 改进获取器对`append`的支持
* 修正一对多关联的`withCount`自关联问题
* `facade`类注释调整
* 改进关联属性的`visible`和`hidden`判断
* 修正路由分组的`MISS`路由
* 改进`pgsql.sql`
支持上一版本的无缝升级。
## V5.1.34 LTS(2019-1-30)
本次更新为常规更新,修正了一些反馈的问题。
* 改进Request类的`has`方法,支持`patch
`
* 改进`unique`验证的多条件支持
* 修复自定义上传验证,检测文件大小
* 改进`in`查询支持表达式
* 改进路由的`getBind`方法
* 改进验证类的错误信息获取
* 改进`response`助手函数默认值
* 修正mysql的`regexp`查询
* 改进模型类型强制转换写入对`Expression`对象的支持
## V5.1.33 LTS(2019-1-16)
本次更新包含了一处安全更新。
- 修复路由中存在多个相同替换的正则BUG
- 修正`whereLike`查询
- `join`方法支持参数绑定
- 改进`union`方法
- 修正多对多关联的`attach`方法
- 改进验证类的正则规则自定义
- 改进Request类`method`方法
- 改进File日志类型的CLI日志写入
- 改进文件日志`time_format`配置对`JSON`格式的支持
## V5.1.32 LTS(2018-12-24)
本次主要为常规更新,修正了一些反馈的问题。
主要更新日志:
* 改进多对多关联的`attach`方法
* 改进聚合查询的`field`处理
* 改进关联的`save`方法
* 修正模型`exists`方法返回值
* 改进时间字段写入和输出
* 改进控制器中间件的调用
* 改进路由变量替换的性能
* 改进缓存标签的处理机制
## V5.1.31 LTS(2018-12-9)
本次版本更新主要涉及一个安全更新,推荐尽快更新到最新版本。
* 改进`field`方法
* 改进`count`方法返回类型
* `download`函数增加在浏览器中显示文件功能
* 修正多对多模型的中间表数据写入
* 改进`sqlsrv`驱动支持多个Schemas模式查询
* 统一助手函数与\think\response\Download函数文件过期时间
* 完善关联模型的`save`方法 增加`make`方法仅创建对象不保存
* 修改条件表达式对静态变量的支持
* 修正控制器名获取
* 改进view方法的`field`解析
## V5.1.30 LTS(2018-11-30)
该版本为常规更新,修正了一些社区反馈的问题。
主要更新如下:
* 改进查询类的`execute`方法
* 判断路由规则定义添加对请求类型的判断
* 修复`orderRaw`异常
* 修正 `optimize:autoload`指令
* 改进软删除的`destroy`方法造成重复执行事件的问题
* 改进验证类对扩展验证规则 始终验证 不管是否`require
`
* 修复自定义验证`remove`所有规则的异常
* 改进时间字段的自动写入支持微秒数据
* 改进`Connection`类的`getrealsql`方法
* 修正`https`地址的URL生成
* 修复 `array_walk_recursive` 在低于PHP7.1消耗内部指针问题
* 改进手动参数绑定使用
* 改进聚合查询方法的`field`参数支持`Expression`
## V5.1.29 LTS(2018-11-11)
该版本主要改进了参数绑定的解析问题和提高性能,并修正了一些反馈的问题。
主要更新如下:
* 改进手动参数绑定
* 修正MISS路由的分组参数无效问题
* 行为支持对象的方法
* 修正全局查询范围
* 改进`belongsto`关联的`has`方法
* 改进`hasMany`关联
* 改进模型观察者多次注册的问题
* 改进`query`类的默认查询参数处理
* 修正`parseBetween`解析方法
* 改进路由地址生成的本地域名支持
* 改进参数绑定的实际URL解析性能
* 改进Env类的`getEnv`和`get`方法
* 改进模板缓存的生成优化
* 修复验证类的多语言支持
* 修复自定义场景验证`remove`规则异常
* File类添加是否自动补全扩展名的选项
* 改进`strpos`对子串是否存在的判断
* 修复`choice`无法用值选择第一个选项问题
* 验证器支持多维数组取值验证
* 改进解析`extend`和`block`标签的正则
## V5.1.28 LTS(2018-10-28)
该版本主要修正了上一个版本存在的一些问题,并改进了关联查询部分。
* 聚合查询方法的字段支持`DISTINCT`
* 修正定义路由后`url`函数的端口支持
* 修正控制器中间件对`swoole`的支持
* 改进Log类`save`方法
* 改进验证类的闭包验证参数
* 多对多关联支持指定中间表数据的名称
* 关联聚合查询支持闭包方式指定聚合字段
* 改进Lang类`get`方法
* 多对多关联增加判断关联数据是否存在的方法
* 改进关联查询使用`fetchsql`的情况
* 改进修改器的是否已经执行判断
* 增加`afterWith`和`beforeWith`验证规则 用于比较日期字段
## V5.1.27 LTS(2018-10-22)
该版本主要修正了路由绑定的参数,改进了修改器的执行多次问题,并正式宣布为LTS版本!
主要更新:
* 修正路由绑定的参数丢失问题
* 修正路由别名的参数获取
* 改进修改器会执行多次的问题
## V5.1.26(2018-10-12)
该版本主要修正了上一个版本的一些问题,并改进了全局查询范围的支持,同时包含了一个安全更新。
主要更新:
* 修正单一模块下注解路由无效的问题
* 改进数据库的聚合查询的字段处理
* 模型类增加`globalScope`属性定义 用于指定全局的查询范围
* 模型的`useGlobalScope`方法支持传入数组 用于指定当前查询需要使用的全局查询范围
* 改进数据集的`order`方法对数字类型的支持
* 修正上一个版本`order`方法解析的一处BUG
* 排序字段不合法或者错误的时候抛出异常
* 改进`Request`类的`file`方法对上传文件的错误判断
## V5.1.25(2018-9-21)
该版本主要改进了查询参数绑定的性能和对浮点型的支持,以及一些细节的完善。
* 修正一处命令行问题
* 改进`Socketlog`日志驱动,支持自定义默认展开日志类别
* 修正`MorphMany`一处bug
* 跳转到上次记住的url,并支持默认值
* 改进模型的异常提示
* 改进参数绑定对浮点型的支持
* 改进`order`方法解析
* 改进`json`字段数据的自动编码
* 改进日志`log_write`可能造成的日志写入死循环
* Log类增加`log_level`行为标签位置,用于对某个类型的日志进行处理
* Route类增加`clear`方法清空路由规则
* 分布式数据库配置支持使用数组
* 单日志文件也支持`max_files`参数
* 改进查询参数绑定的性能
* 改进别名路由的URL后缀参数检测
* 控制器前置方法和控制器中间件的`only`和`except`定义不区分大小写
## V5.1.24(2018-9-5)
该版本主要增加了命令行的表格输出功能,并增加了查看路由定义的指令,以及修正了社区的一些反馈问题。
* 修正`Request`类的`file`方法
* 修正路由的`cache`方法
* 修正路由缓存的一处问题
* 改进上传文件获取的异常处理
* 改进`fetchCollection`方法支持传入数据集类名
* 修正多级控制器的注解路由生成
* 改进`Middleware`类`clear`方法
* 增加`route:list`指令用于[查看定义的路由](752690) 并支持排序
* 命令行增加`Table`输出类
* `Command`类增加`table`方法用于输出表格
* 改进搜索器查询方法支持别名定义
* 命令行配置增加`auto_path`参数用于定义自动载入的命令类路径
* 增加`make:command`指令用于[快速生成指令](354146)
* 改进`make:controller`指令对操作方法后缀的支持
* 改进命令行的定义文件支持索引数组 用于指令对象的惰性加载
* 改进`value`和`column`方法对后续查询结果的影响
* 改进`RuleName`类的`setRule`方法
## V5.1.23(2018-8-23)
该版本主要改进了数据集对象的处理,增加了`findOrEmpty`方法,并且修正了一些社区反馈的BUG。
* 数据集类增加`diff`/`intersect`方法用于获取差集和交集(默认根据主键值比较)
* 数据集类增加`order`方法支持指定字段排序
* 数据集类增加`map`方法使用回调函数处理数据并返回新的数据集对象
* Db增加`allowEmpty`方法允许`find`方法在没有数据的时候返回空数组或者空模型对象而不是null
* Db增加`findOrEmpty`方法
* Db增加`fetchCollection`方法用于指定查询返回数据集对象
* 改进`order`方法的数组方式解析,增强安全性
* 改进`withSearch`方法,支持第三个参数传入字段前缀标识,用于多表查询字段搜索
* 修正`optimize:route`指令开启类库后缀后的注解路由生成
* 修正redis缓存及session驱动
* 支持指定`Yaconf`的独立配置文件
* 增加`yaconf`助手函数用于配置文件
## V5.1.22(2018-8-9)
该版本主要增加了模型搜索器和`withJoin`方法,完善了模型输出和对`Yaconf`的支持,修正了一些社区反馈的BUG。
* 改进一对一关联的`table`识别问题
* 改进内置`Facade`类
* 增加`withJoin`方法支持`join`方式的[一对一关联](一对一关联.md)查询
* 改进`join`预载入查询的空数据问题
* 改进`Config`类的`load`方法支持快速加载配置文件
* 改进`execute`方法和事务的断线重连
* 改进`memcache`驱动的`has`方法
* 模型类支持定义[搜索器](搜索器.md)方法
* 完善`Config`类对`Yaconf`的支持
* 改进模型的`hidden/visible/append/withAttr`方法,支持在[查询前后调用](数组访问.md),以及支持数据集对象
* 数据集对象增加`where`方法根据字段或者关联数据[过滤数据](模型数据集.md)
* 改进AJAX请求的`204`判断
## V5.1.21(2018-8-2)
该版本主要增加了下载响应对象和数组查询对象的支持,并修正了一些社区反馈的问题。
* 改进核心对象的无用信息调试输出
* 改进模型的`isRelationAttr`方法判断
* 模型类的`get`和`all`方法并入Db类
* 增加[下载响应对象](文件下载.md)和`download`助手函数
* 修正别名路由配置定义读取
* 改进`resultToModel`方法
* 修正开启类库后缀后的注解路由生成
* `Response`类增加`noCache`快捷方法
* 改进路由对象在`Swoole`/`Workerman`下面参数多次合并问题
* 修正路由`ajax`/`pjax`参数后路由变量无法正确获取的问题
* 增加清除中间件的方法
* 改进依赖注入的参数规范自动识别(便于对接前端小写+下划线规范)
* 改进`hasWhere`的数组条件的字段判断
* 增加[数组查询对象](高级查询.md)`Where`支持(喜欢数组查询的福音)
* 改进多对多关联的闭包支持
## V5.1.20(2018-7-25)
该版本主要增加了Db和模型的动态获取器的支持,并修正了一些已知问题。
* Db类添加[获取器支持](703981)
* 支持模型及关联模型字段[动态定义获取器](354046)
* 动态获取器支持`JSON`字段
* 改进路由的`before`行为执行(匹配后执行)
* `Config`类支持`Yaconf`
* 改进Url生成的端口问题
* Request类增加`setUrl`和`setBaseUrl`方法
* 改进页面trace的信息显示
* 修正`MorphOne`关联
* 命令行添加[查看版本指令](703994)
## V5.1.19 (2018-7-13)
该版本是一个小幅改进版本,针对`Swoole`和`Workerman`的`Cookie`支持做了一些改进,并修正了一些已知的问题。
主要更新包括:
* 改进query类`delete`方法对软删除条件判断
* 修正分表查询的软删除问题
* 模型查询的时候同时传入`table`和`name`属性
* 容器类增加`IteratorAggregate`和`Countable`接口支持
* 路由分组支持对下面的资源路由统一设置`only/except/vars`参数
* 改进Cookie类更好支持扩展
* 改进Request类`post`方法
* 改进模型自关联的自动识别
* 改进Request类对`php://input`数据的处理
## V5.1.18 (2018-6-30)
该版本主要完善了对`Swoole`和`Workerman`的`HttpServer`运行支持,改进`Request`类,并修正了一些已知的问题。
主要更新如下:
* 改进关联`append`方法的处理
* 路由初始化和检测方法分离
* 修正`destroy`方法强制删除
* `app_init`钩子位置移入`run`方法
* `think-swoole`扩展更新到2.0版本
* `think-worker`扩展更新到2.0版本
* 改进Url生成的域名自动识别
* `Request`类增加`setPathinfo`方法和`setHost`方法
* `Request`类增加`withGet`/`withPost`/`withHeader`/`withServer`/`withCookie`/`withEnv`方法进行赋值操作
* Route类改进`host`属性的获取
* 解决注解路由配置不生效的问题
* 取消Test日志驱动,改为使用`close`设置关闭全局日志写入
* 修正路由的`response`参数
* 修正204响应输出的判断
## V5.1.17 (2018-6-18)
该版本主要增加了控制器中间件的支持,改进了路由功能,并且修正了社区反馈的一些问题。
* 修正软删除的`delete`方法
* 修正Query类`Count`方法
* 改进多对多`detach`方法
* 改进Request类`Session`方法
* 增加控制器中间件支持
* 模型类增加`jsonAssoc`属性用于定义json数据是否返回数组
* 修正Request类`method`方法的请求伪装
* 改进静态路由的匹配
* 分组首页路由自动完整匹配
* 改进sqlsrv的`column`方法
* 日志类的`apart_level`配置支持true自动生成对应类型的日志文件
* 改进`204`输出判断
* 修正cli下页面输出的BUG
* 验证类使用更高效的`ctype`验证机制
* 改进Request类`cookie`方法
* 修正软删除的`withTrashed`方法
* 改进多态一对多的预载入查询
* 改进Query类`column`方法的缓存读取
* Query类增加`whereBetweenTimeField`方法
* 改进分组下多个相同路由规则的合并匹配问题
* 路由类增加`getRule`/`getRuleList`方法获取定义的路由
## V5.1.16 (2018-6-7)
该版本主要修正了社区反馈的一些问题,并对Request类做了进一步规范和优化。
* 改进Session类的`boot`方法
* App类的初始化方法可以单独执行
* 改进Request类的`param`方法
* 改进资源路由的变量替换
* Request类增加`__isset`方法
* 改进`useGlobalScope`方法对软删除的影响
* 修正命令行调用
* 改进Cookie类`init`方法
* 改进多对多关联删除的返回值
* 一对多关联写入支持`replace`
* 路由增加`filter`检测方法,用于通过请求参数检测路由是否匹配
* 取消Request类`session/env/server`方法的`filter`参数
* 改进关联的指定属性输出
* 模型删除操作删除后不清空对象数据仅作标记
* 调整模型的`save`方法返回值为布尔值
* 修正Request类`isAjax`方法
* 修正中间件的模块配置读取
* 取消Request类的请求变量的设置功能
* 取消请求变量获取的默认修饰符
* Request类增加`setAction/setModule/setController`方法
* 关联模型的`delete`方法调用Query类
* 改进URL生成的域名识别
* 改进URL检测对已定义路由的域名判断
* 模型类增加`isExists`和`isForce`方法
* 软删除的`destroy`和`restore`方法返回值调整为布尔值
## V5.1.15 (2018-6-1)
该版本主要改进了路由缓存的性能和缓存方式设置,增加了JSON格式文件日志的支持,并修正了社区反馈的一些问题。
* 容器类增加`exists`方法 仅判断是否存在对象实例
* 取消配置类的`autoload`方法
* 改进路由缓存大小提高性能
* 改进Dispatch类`init`方法
* 增加`make:validate`指令生成验证器类
* Config类`get`方法支持默认值参数
* 修正字段缓存指令
* 改进App类对`null`数据的返回
* 改进模型类的`__isset`方法判断
* 修正`Query`类的`withAggregate`方法
* 改进`RuleItem`类的`setRuleName`方法
* 修正依赖注入和参数的冲突问题
* 修正Db类对第三方驱动的支持
* 修正模型类查询对象问题
* 修正File缓存驱动的`has`方法
* 修正资源路由嵌套
* 改进Request类对`$_SERVER`变量的读取
* 改进请求缓存处理
* 路由缓存支持指定单独的缓存方式和参数
* 修正资源路由的中间件多次执行问题
* 修正`optimize:config`指令
* 文件日志支持`JSON`格式日志保存
* 修正Db类`connect`方法
* 改进Log类`write`方法不会自动写入之前日志
* 模型的关联操作默认启用事务
* 改进软删除的事件响应
## V5.1.14 (2018-5-18)
该版本主要对底层容器进行了一些优化改进,并增加了路由缓存功能,可以进一步提升路由性能。
* 依赖注入的对象参数传入改进
* 改进核心类的容器实例化
* 改进日期字段的读取
* 改进验证类的`getScene`方法
* 模型的`create`方法和`save`方法支持`replace`操作
* 改进`Db`类的调用机制
* App类调整为容器类
* 改进容器默认绑定
* `Loader`类增加工厂类的实例化方法
* 增加路由变量默认规则配置参数
* 增加路由缓存设计
* 错误处理机制改进
* 增加清空路由缓存指令
## V5.1.13 (2018-5-11)
该版本主要增加了MySQL的XA事务支持,模型事件支持观察者,以及对Facade类的改进。
* 改进自动缓存
* 改进Url生成
* 修正数据缓存
* 修正`value`方法的缓存
* `join`方法和`view`方法的条件支持使用`Expression`对象
* 改进驱动的`parseKey`方法
* 改进Request类`host`方法和`domain`方法对端口的处理
* 模型增加`withEvent`方法用于控制当前操作是否需要执行模型事件
* 模型`setInc/setDec`方法支持更新事件
* 模型添加`before_restore/after_restore`事件
* 增加模型事件观察者
* 路由增加`mobile`方法设置是否允许手机访问
* 数据库XA事务支持
* 改进索引数组查询对`IN`查询的支持
* 修正`invokeMethod`方法
* 修正空数据写入返回值的BUG
* redis驱动支持`predis`
* 改进`parseData`方法
* 改进模块加载
* App类初始化方法调整
* 改进数组查询对表达式`Expression`对象支持
* 改进闭包的依赖注入调用
* 改进多对多关联的中间表模型更新
* 增加容器中对象的自定义实例化
## V5.1.12 (2018-4-25)
该版本主要改进了主从查询的及时性,并支持动态设置请求数据。
* 支持动态设置请求数据
* 改进`comment`方法解析
* 修正App类`__unset`方法
* 改进url生成的域名绑定
* 改进主从查询的及时性
* 修正`value`的数据缓存功能
* 改进分页类的集合对象方法调用
* 改进Db类的代码提示
* SQL日志增加主从标记
## V5.1.11 (2018-4-19)
该版本为安全和修正版本,改进了JSON查询的参数绑定问题和容器类对象实例获取,并包含一处可能的安全隐患,建议更新。
* 支持指定JSON数据查询的字段类型
* 修正`selectInsert`方法
* `whereColumn`方法支持数组方式
* 改进容器类`make`方法
* 容器类`delete`方法支持数组
* 改进`composer`自动加载
* 改进模板引擎
* 修正`like`查询的一处安全隐患
## V5.1.10 (2018-4-16)
该版本为修正版本,修正上一个版本的一些BUG,并增强了`think clear`指令。
* 改进`orderField`方法
* 改进`exists`查询
* 修改cli模式入口文件位置计算
* 修正`null`查询
* 改进`parseTime`方法
* 修正关联预载入查询
* 改进`mysql`驱动
* 改进`think clear`指令 支持 `-c -l -r `选项
* 改进路由规则对`/`结尾的支持
## V5.1.9 (2018-4-12)
该版本主要是一些改进和修正,并包含一个安全更新,是一个推荐更新版本。
* 默认模板渲染规则支持配置保持操作方法名
* 改进`Request`类的`ip`方法
* 支持模型软删除字段的默认值定义
* 改进路由变量规则对中文的支持
* 使用闭包查询的时候使用`cache(true)` 抛出异常提示
* 改进`Loader`类`loadComposerAutoloadFiles`方法
* 改进查询方法安全性
* 修正路由地址中控制器名驼峰问题
* 调整上一个版本的`module_init`和`app_begin`的钩子顺序问题
* 改进CLI命令行执行的问题
* 修正社区反馈的其它问题
## V5.1.8 (2018-4-5)
该版本主要改进了中间件的域名和模块支持,并同时修正了几个已知问题。
* 增加`template.auto_rule` 参数设置默认模板渲染的操作名自动转换规则
* 默认模板渲染规则改由视图驱动实现
* 修正路由标识定义
* 修正控制器路由方法
* 改进Request类`ip`方法支持自定义代理IP参数
* 路由注册中间件支持数组方式别名
* 改进命令行执行下的`composer`自动加载
* 添加域名中间件注册支持
* 全局中间件支持模块定义文件
* Log日志配置支持`close`参数可以全局关闭日志写入
* 中间件方法中捕获`HttpResponseException`异常
* 改进中间件的闭包参数传入
* 改进分组路由的延迟解析
* 改进URL生成对域名绑定的支持
* 改进文件缓存和文件日志驱动的并发支持
## V5.1.7 (2018-3-28)
该版本主要修正了路由的一些问题,并改进了查询的安全性。
* 支持`middleware`配置文件预先定义中间件别名方便路由调用
* 修正资源路由
* 改进`field`方法 自动识别`fieldRaw`
* 增加`Expression`类
* Query类增加`raw`方法
* Query类的`field`/ `order` 和` where`方法都支持使用`raw`表达式查询
* 改进`inc/dec`查询 支持批量更新
* 改进路由分组
* 改进Response类`create`方法
* 改进composer自动加载
* 修正域名路由的`append`方法
* 修正操作方法的初始化方法获取不到问题
## V5.1.6 (2018-3-26)
该版本主要改进了路由规则的匹配算法,大幅提升了路由性能。并正式引入了中间件的支持,可以在路由中定义或者全局定义。另外包含了一个安全更新,是一个建议更新版本。
* 改进URL生成对路由`ext`方法的支持
* 改进查询缓存对不同数据库相同表名的支持
* 改进composer自动加载的性能
* 改进空路由变量对默认参数的影响
* mysql的`json`字段查询支持多级
* Query类增加`option`方法
* 优化路由匹配
* 修复验证规则数字键名丢失问题
* 改进路由Url生成
* 改进一对一关联预载入查询
* Request类增加`rootDomain`方法
* 支持API资源控制器生成 `make:controller --api`
* 优化Template类的标签解析
* 容器类增加删除和清除对象实例的方法
* 修正MorphMany关联的`eagerlyMorphToMany`方法一处错误
* Container类的异常捕获改进
* Domain对象支持`bind`方法
* 修正分页参数
* 默认模板的输出规则不受URL影响
* 注解路由支持多级控制器
* Query类增加`getNumRows`方法获取前次操作影响的记录数
* 改进查询条件的性能
* 改进模型类`readTransform`方法对序列化类型的处理
* Log类增加`close`方法可以临时关闭当前请求的日志写入
* 文件日志方式增加自动清理功能(设置`max_files`参数)
* 修正Query类的`getPk`方法
* 修正模板缓存的布局开关问题
* 修正Query类`select`方法的缓存
* 改进input助手函数
* 改进断线重连的信息判断
* 改进正则验证方法
* 调整语言包的加载顺序 放到`app_init`之前
* controller类`fetch`方法改为`final`
* 路由地址中的变量支持使用``方式
* 改进XMLResponse 支持传入编码过的xml内容
* 修正Query类`view`方法的数组表名支持
* 改进路由的模型闭包绑定
* 改进分组变量规则的继承
* 改进`cli-server`模式下的`composer`自动加载
* 路由变量规则异常捕获
* 引入中间件支持
* 路由定义增加`middleware`方法
* 增加生成中间件指令`make:middleware`
* 增加全局中间件定义支持
* 改进`optimize:config`指令对全局中间件的支持
* 改进config类`has`方法
* 改进时间查询的参数绑定
* 改进`inc/dec/exp`查询的安全性
## V5.1.5 (2018-1-31)
该版本主要增强了数据库的JSON查询,并支持JSON字段的聚合查询,改进了一些性能问题,修正了路由的一些BUG,主要更新如下:
* 改进数据集查询对`JSON`数据的支持
* 改进聚合查询对`JSON`字段的支持
* 模型类增加`getOrFail`方法
* 改进数据库驱动的`parseKey`方法
* 改进Query类`join`方法的自关联查询
* 改进数据查询不存在不生成查询缓存
* 增加`run`命令行指令启动内置服务器
* `Request`类`pathinfo`方法改进对`cli-server`支持
* `Session`类增加`use_lock`配置参数设置是否启用锁机制
* 优化`File`缓存自动生成空目录的问题
* 域名及分组路由支持`append`方法传递隐式参数
* 改进日志的并发写入问题
* 改进`Query`类的`where`方法支持传入`Query`对象
* 支持设置单个日志文件的文件名
* 修正路由规则的域名条件约束
* `Request`类增加`subDomain`方法用于获取当前子域名
* `Response`类增加`allowCache`方法控制是否允许请求缓存
* `Request`类增加`sendData`方法便于扩展
* 改进`Env`类不依赖`putenv`方法
* 改进控制台`trace`显示错误
* 改进`MorphTo`关联
* 改进完整路由匹配后带斜线访问出错的情况
* 改进路由的多级分组问题
* 路由url地址生成支持多级分组
* 改进路由Url生成的`url_convert`参数的影响
* 改进`miss`和`auto`路由内部解析
* 取消预载入关联查询缓存功能
## V5.1.4 (2018-1-19)
该版本主要增强了数据库和模型操作,主要更新如下:
* 支持设置 `deleteTime`属性为`false` 关闭软删除
* 模型增加`getError`方法
* 改进Query类的`getTableFields`/`getFieldsType`方法 支持表名自动获取
* 模型类`toCollection`方法增加参数指定数据集类
* 改进`union`查询
* 关联预载入`with`方法增加缓存参数
* 改进模型类的`get`和`all`方法的缓存 支持关联缓存
* 支持`order by field`操作
* 改进`insertAll`分批写入
* 改进`json`字段数据支持
* 增加JSON数据的模型对象化操作
* 改进路由`ext`参数检测
* 修正`rule`方法的`method`参数使用 `get|post` 方式注册路由的问题
## V5.1.3 (2018-1-12)
该版本主要改进了路由及调整函数加载顺序,主要更新如下:
* 增加`env`助手函数;
* 增加`route`助手函数;
* 增加视图路由方法;
* 增加路由重定向方法;
* 路由默认区分最后的目录斜杆(支持设置不区分);
* 调整公共文件和配置文件的加载顺序(可以在配置文件中直接使用助手函数);
* 视图类增加`filter`方法设置输出过滤;
* `view`助手函数增加`filter`参数;
* 改进缓存生成指令;
* Session类的`get`方法支持获取多级;
* Request类`only`方法支持指定默认值;
* 改进路由分组;
* 修正使用闭包查询的时候自动数据缓存出错的情况;
* 废除`view_filter`钩子位置;
* 修正分组下面的资源路由;
* 改进session驱动;
## V5.1.2 (2018-1-8)
该版本改进了配置类及数据库类,主要更新如下:
* 修正嵌套路由分组;
* 修正自定义模板标签界定符后表达式语法出错的情况;
* 修正自关联的多次调用问题;
* 修正数组查询的`null`条件查询;
* 修正Query类的`order`及`field`的一处可能的BUG;
* 配置参数设置支持三级;
* 配置对象支持`ArrayAccess`;
* App类增加`path`方法用于设置应用目录;
* 关联定义增加`selfRelation`方法用于设置是否为自关联;
## V5.1.1 (2018-1-3)
修正一些反馈的BUG,包括:
* 修正Cookie类存取数组的问题
* 修正Controller的`fetch`方法
* 改进跨域请求
* 修正`insertAll`方法
* 修正`chunk`方法
## V5.1.0 (2018-1-1)
主要更新如下:
* 增加注解路由支持
* 路由支持跨域请求设置
* 增加`app_dispatch`钩子位置
* 修正多对多关联的`detach`方法
* 修正软删除的`destroy`方法
* Cookie类`httponly`参数默认为false
* 日志File驱动增加`single`参数配置记录同一个文件(不按日期生成)
* 路由的`ext`和`denyExt`方法支持不传任何参数
* 改进模型的`save`方法对`oracle`的支持
* Query类的`insertall`方法支持配合`data`和`limit`方法
* 增加`whereOr`动态查询支持
* 日志的ip地址记录改进
* 模型`saveAll`方法支持`isUpdate`方法
* 改进`Pivot`模型的实例化操作
* 改进Model类的`data`方法
* 改进多对多中间表模型类
* 模型增加`force`方法强制更新所有数据
* Hook类支持设置入口方法名称
* 改进验证类
* 改进`hasWhere`查询的数据重复问题
* 模型的`saveall`方法返回数据集对象
* 改进File缓存的`clear`方法
* 缓存添加统一的序列化机制
* 改进泛三级域名的绑定
* 改进泛域名的传值和取值
* Request类增加`panDomain`方法
* 改进废弃字段判断
* App类增加`create`方法用于实例化应用类库
* 容器类增加`has`方法
* 改进多数据库切换连接
* 改进断线重连的异常捕获
* 改进模型类`buildQuery`方法
* Query类增加`unionAll`方法
* 关联统计功能增强(支持Sum/Max/Min/Avg)
* 修正延迟写入
* chunk方法支持复合主键
* 改进JSON类型的写入
* 改进Mysql的insertAll方法
* Model类`save`方法改进复合主键包含自增的情况
* 改进Query类`inc`和`dec`方法的关键字处理
* File缓存inc和dec方法保持原来的有效期
* 改进redis缓存的有效期判断
* 增加checkRule方法用于单独数据的多个验证规则
* 修正setDec方法的延迟写入
* max和min方法增加force参数
* 二级配置参数区分大小写
* 改进join方法自关联的问题
* 修正关联模型自定义表名的情况
* Query类增加getFieldsType和getTableFields方法
* 取消视图替换功能及view_replace_str配置参数
* 改进域名绑定模块后的额外路由规则问题
* 改进mysql的insertAll方法
* 改进insertAll方法写入json字段数据的支持
* 改进redis长连接多编号库的情况
## RC3版本(2017-11-6)
主要更新如下:
* 改进redis驱动的`get`方法
* 修正Query类的`alias`方法
* `File`类错误信息支持多语言
* 修正路由的额外参数解析
* 改进`whereTime`方法
* 改进Model类`getAttr`方法
* 改进App类的`controller`和`validate`方法支持多层
* 改进`HasManyThrough`类
* 修正软删除的`restore`方法
* 改进`MorpthTo`关联
* 改进数据库驱动类的`parseKey`方法
* 增加`whereField`动态查询方法
* 模型增加废弃字段功能
* 改进路由的`after`行为检查和`before`行为机制
* 改进路由分组的检查
* 修正mysql的`json`字段查询
* 取消Connection类的`quote`方法
* 改进命令行的支持
* 验证信息支持多语言
* 修正路由模型绑定
* 改进参数绑定类型对枚举类型的支持
* 修正模板的`{$Think.version} `输出
* 改进模板`date`函数解析
* 改进`insertAll`方法支持分批执行
* Request类`host`方法支持反向代理
* 改进`JumpResponse`支持区分成功和错误模板
* 改进开启类库后缀后的关联外键自动识别问题
* 修正一对一关联的JOIN方式预载入查询问题
* Query类增加`hidden`方法
## RC2版本(2017-10-17)
主要更新如下:
* 修正视图查询
* 修正资源路由
* 修正`HasMany`关联 修正`where`方法的闭包查询
* 一对一关联绑定属性到父模型后 关联属性不再保留
* 修正应用的命令行配置文件读取
* 改进`Connection`类的`getCacheKey`方法
* 改进文件上传的非法图像异常
* 改进验证类的`unique`规则
* Config类`get`方法支持获取一级配置
* 修正count方法对`fetchSql`的支持
* 修正mysql驱动对`socket`支持
* 改进Connection类的`getRealSql`方法
* 修正`view`助手函数
* Query类增加`leftJoin` `rightJoin` 和 `fullJoin`方法
* 改进app_namespace的获取
* 改进`append`方法对一对一`bind`属性的支持
* 改进关联的`saveall`方法的返回值
* 路由标识设置异常修复
* 改进Route类`rule`方法
* 改进模型的`table`属性设置
* 改进composer autofile的加载顺序
* 改进`exception_handle`配置对闭包的支持
* 改进app助手函数增加参数
* 改进composer的加载路径判断
* 修正路由组合变量的URL生成
* 修正路由URL生成
* 改进`whereTime`查询并支持扩展规则
* File类的`move`方法第二个参数支持`false`
* 改进Config类
* 改进缓存类`remember`方法
* 惯例配置文件调整 Url类当普通模式参数的时候不做`urlencode`处理
* 取消`ROOT_PATH`和`APP_PATH`常量定义 如需更改应用目录 自己重新定义入口文件
* 增加`app_debug`的`Env`获取
* 修正泛域名绑定
* 改进查询表达式的解析机制
* mysql增加`regexp`查询表达式 支持正则查询
* 改进查询表达式的异常判断
* 改进model类的`destroy`方法
* 改进Builder类 取消`parseValue`方法
* 修正like查询的参数绑定问题
* console和start文件移出核心纳入应用库
* 改进Db类主键删除方法
* 改进泛域名绑定模块
* 取消`BIND_MODULE`常量 改为在入口文件使用`bind`方法设置
* 改进数组查询
* 改进模板渲染的异常处理
* 改进控制器基类的架构方法参数
* 改进Controller类的`success`和`error`方法
* 改进对浏览器`JSON-Handle`插件的支持
* 优化跳转模板的移动端显示
* 修正模型查询的`chunk`方法对时间字段的支持
* 改进trace驱动
* Collection类增加`push`方法
* 改进Redis Session驱动
* 增加JumpResponse驱动
## RC1(2017-9-8)
主要新特性为:
* 引入容器和Facade支持
* 依赖注入完善和支持更多场景
* 重构的(对象化)路由
* 配置和路由目录独立
* 取消系统常量
* 助手函数增强
* 类库别名机制
* 模型和数据库增强
* 验证类增强
* 模板引擎改进
* 支持PSR-3日志规范
* RC1版本取消了5.0多个字段批量数组查询的方式
';
升级指导
最后更新于:2022-04-02 01:55:40
# 5.1版本升级指导
本章节的内容告诉你进行`5.1.*`版本的升级须知和建议,由于一些必要原因,个别版本的升级并非完全无缝,请尽量按照本升级指导的建议进行调整。
[TOC=2,2]
## 升级到`5.1.38`
视图渲染输出的时候,如果你需要获取渲染内容,需要改成
```
$html = $this->fetch()->getContent();
```
## 从`5.1.27`升级到最新版本
>[danger] 由于`5.1.27`已经是LTS版本,不会再出现不兼容的升级。
> 从`5.1.27`版本可以无缝升级到后续的`5.1.*`版本。
## 从`5.1.26`升级到`5.1.27`
从`5.1.26`版本可以无缝升级到`5.1.27`。
## 从`5.1.25`升级到`5.1.26`
从`5.1.25`版本可以无缝升级到`5.1.26`。
## 从`5.1.24`升级到`5.1.25`
从`5.1.24`版本可以无缝升级到`5.1.25`。
## 从`5.1.23`升级到`5.1.24`
从`5.1.23`版本可以无缝升级到`5.1.24`。
## 从`5.1.22`升级到`5.1.23`
从`5.1.22`版本可以无缝升级到`5.1.23`。
## 从`5.1.21`升级到`5.1.22`
从`5.1.21`版本可以无缝升级到`5.1.22`。
## 从`5.1.20`升级到`5.1.21`
从`5.1.20`版本可以无缝升级到`5.1.21`。
## 从`5.1.19`升级到`5.1.20`
从`5.1.19`版本可以无缝升级到`5.1.20`。
## 从`5.1.18`升级到`5.1.19`
从`5.1.18`版本可以无缝升级到`5.1.19`。
## 从`5.1.17`升级到`5.1.18`
从`5.1.17`版本可以无缝升级到`5.1.18`。由于取消了Test日志驱动,如果使用了Test日志驱动,请改为使用下面的配置全局关闭:
~~~
'close' => true,
~~~
## 从`5.1.16`升级到`5.1.17`
从`5.1.16`版本可以无缝升级到`5.1.17`。
## 从`5.1.15`升级到`5.1.16`
从`5.1.15`版本可以无缝升级到`5.1.16`。
> 不过注意一点,`Request`对象不再支持对请求变量的设置操作了,如果需要请使用 `$request->name` 的方式直接设置。
## 从`5.1.14`升级到`5.1.15`
从`5.1.14`版本可以无缝升级到`5.1.15`。
## 从`5.1.13`升级到`5.1.14`
从`5.1.13`版本基本可以无缝升级到`5.1.14`。
> 补充一点,如果动态配置设置`view_path`(在新版中不要动态配置,因为容器中的对象一旦实例化后是不会每次读取动态配置值的,减少依赖,也更方便单元测试),需要改成在控制器中调用:
> ~~~
> $this->view->config('view_path','path');
> ~~~
> 或者使用了view方法输出的话,可以使用
> ~~~
> think\facade\View::config('view_path','path');
> ~~~
## 从`5.1.12`升级到`5.1.13`
从`5.1.12`版本可以无缝升级到`5.1.13`。
## 从`5.1.11`升级到`5.1.12`
从`5.1.11`版本可以无缝升级到`5.1.12`。
## 从`5.1.10`升级到`5.1.11`
从`5.1.10`版本可以无缝升级到`5.1.11`。
## 从`5.1.9`升级到`5.1.10`
如果数组查询条件中使用了`exists`查询,必须做出如下调整:
~~~
// 错误
$where[] = ['', 'exists', 'select * from user where status = 0'];
// 正确
$where[] = ['', 'exists', Db::raw('select * from user where status = 0')];
~~~
建议的方式是使用
~~~
$model->whereExists('select * from user where status = 0')->select();
~~~
## 从`5.1.8`升级到`5.1.9`
从`5.1.8`升级到`5.1.9`的时候,请注意如下事项:
下面方式的数组条件查询不再使用索引数组
~~~
// 错误
$where['name'] = ['name', 'like', 'think'];
// 正确
$where[] = ['name', 'like', 'think'];
~~~
但对于基本条件查询不受影响
~~~
// 正确
$where['name'] = 'think';
~~~
但并不支持混合查询:
~~~
// 错误
$where['name'] = 'think';
$where[] = ['id', '<=', 10];
~~~
如果数组查询条件中使用了`exp`查询,必须做出如下调整:
~~~
// 错误
$where[] = ['id', 'exp', '>score'];
// 正确
$where[] = ['id', 'exp', Db::raw('>score')];
~~~
表达式查询方式不受影响。
>[danger] 如果你使用了闭包查询条件,并且使用了默认的查询缓存`cache()`或者`cache(true)`,新版本会抛出异常,请使用`cache('key')`替代,避免因为查询缓存无效而影响业务。
另外可能不影响但推荐使用的建议:
> `order/field/where`方法如果使用字符串参数并涉及到SQL函数的,推荐使用`orderRaw/fieldRaw/whereRaw`方法,或者对传入的字符串参数使用`Db::raw()`方法。
## 从`5.1.7`升级到`5.1.8`
从`5.1.7`版本可以无缝升级到`5.1.8`。
如果你从`5.1.5`直接升级的话,可以通过配置 `template.auto_rule` 参数为2,兼容之前的默认模板渲染规则。
## 从`5.1.6`升级到`5.1.7`
从`5.1.6`版本可以无缝升级到`5.1.7`。
## 从`5.1.5`升级到`5.1.6`
>[danger] 从`5.1.5`升级到`5.1.6`的过程需要注意如下事项:
### 路由变量规则调整
路由变量规则的定义不再支持使用模式修饰符和诸如`^\d+$`这种限定符。
例如
~~~
Route::rule('hello/:name','hello')
->pattern('name','/^\w{4}+$/i');
~~~
需要调整为
~~~
Route::rule('hello/:name','hello')
->pattern('name','\w{4}+');
~~~
### 路由标识用法调整
原来的
~~~
Route::name('路由标识')->rule('rule','route');
~~~
需要改成
~~~
Route::rule('rule','route')->name('路由标识');
~~~
### EXP表达式更新
出于安全性考虑,如果使用了`EXP`表达式更新,请使用`exp`方法替代数组方式。
### 默认模板渲染规则改进
由于`fetch`方法和`view`函数的默认模板规则调整为操作方法的名称(不含操作后缀)转换为小写+下划线方式,而不是原来的直接把操作名称转小写。
举个例子,你的控制器操作方法名如果是`helloWorld`,之前版本使用:
~~~
$this->fetch();
// 或者
view();
~~~
渲染输出的时候会定位到 `helloworld.html`模板文件,而新版会自动定位到`hello_world.html`模板文件。
> 对于指定模板渲染的`fetch`方法和`view`助手函数不受影响,对于非驼峰操作方法名也没有影响。
## 从`5.1.0`升级到`5.1.5`
从`5.1.0`版本可以无缝升级到`5.1.5`(包含以下任何一个版本)。
## 从`5.0`升级到`5.1`
由于`5.1`版本很多用法不同于`5.0`版本,本篇内容帮助你更顺利的从`5.0`版本迁移到`5.1`版本。
>[danger] 如非必要,在建项目请勿盲目升级,5.0版本依然持续维护中。
### 命名空间调整
如果你自定义了应用类库的命名空间,需要改为设置环境变量`APP_NAMESPACE`而不是应用配置文件,如果你使用了`.env`配置文件,可以在里面添加:
~~~
APP_NAMESPACE = 你的应用类库根命名空间名
~~~
然后,检查你的应用类库中`use`或者调用的系统类库,如果使用了下面的系统类库(主要涉及的类库是`5.0`静态调用的系统类库),那么命名空间需要调整如下:
|5.0系统|5.1系统|
|---|---|
| think\App | think\facade\App (或者 App )|
| think\Cache | think\facade\Cache (或者 Cache )|
| think\Config | think\facade\Config (或者 Config )|
| think\Cookie | think\facade\Cookie (或者 Cookie )|
| think\Debug | think\facade\Debug (或者 Debug )|
| think\Env | think\facade\Env (或者 Env )|
| think\Hook | think\facade\Hook (或者 Hook )|
| think\Lang | think\facade\Lang (或者 Lang )|
| think\Log | think\facade\Log (或者 Log )|
| think\Request | think\facade\Request (或者 Request )|
| think\Response | think\facade\Response (或者 Response )|
| think\Route | think\facade\Route (或者 Route )|
| think\Session | think\facade\Session (或者 Session )|
| think\Url | think\facade\Url (或者 Url )|
| think\Validate | think\facade\Validate (或者 Validate )|
| think\View | think\facade\View (或者 View )|
>[danger] 如果只是用于依赖注入则无需更改命名空间。
后面括号里面的类名使用是的根命名空间(`\`),这是因为5.1对常用的系统核心类库做了类库别名,举个例子,如果应用类库开头`use`了 `think\Url`
~~~
use think\Url;
Url::build('index/index');
~~~
则需要改成
~~~
use think\facade\Url;
Url::build('index/index');
~~~
或者
~~~
use Url;
Url::build('index/index');
~~~
>[info] 5.1为系统的类库注册了类库别名,因此可以直接从根命名空间方式调用Url。
所以路由配置文件在迁移到`5.1`版本后你可以直接删除下面的一行代码
~~~
use think\Route;
~~~
### 配置文件调整
原有的配置文件`config.php`从应用目录移动到和应用目录同级的`config`目录,并拆分为`app.php`、`cache.php` 等独立配置文件,系统默认的配置文件清单如下:
|配置文件|说明|
|---|---|
|app.php| 应用配置文件|
|cache.php|缓存配置文件|
|cookie.php|Cookie配置文件|
|database.php|数据库配置文件|
|log.php|日志配置文件|
|session.php|Session配置文件|
|template.php|模板引擎配置文件|
|trace.php|页面Trace配置文件|
>[info] 换而言之就是原来所有的一级配置都独立为一个配置文件
原来的应用`extra`目录下面的配置文件直接移动到`config`目录下面。
原来模块的配置文件(包括extra目录下面的)直接移动到模块下的`config`目录,然后参考上面的应用配置文件进行调整。
5.1的配置文件全部采用二级配置方式,所有**不带一级配置名的参数都会作为`app`的二级配置**,例如
~~~
config('app_debug');
~~~
等同于
~~~
config('app.app_debug');
~~~
> 并且注意,5.1的二级配置参数区分大小写。
一级配置`app`下的配置参数都在`app.php`配置文件中定义。
如果要获取数据库配置(`database.php`文件)的参数,则需要使用
~~~
config('database.hostname');
~~~
动态设置配置参数的时候,也要注意一级配置名
~~~
config('cache.type', 'memcache');
~~~
如果要获取一级配置下面的所有参数,使用
~~~
Config::pull('database');
// 或者使用
config('database.');
~~~
`view_replace_str`配置参数改成template配置文件的`tpl_replace_string`配置参数。
### 常量调整
`5.1`取消了所有的框架内置常量(不影响应用代码中的自定义常量),如需获取,请使用`think\facade\App`类的内置方法以及`think\facade\Env`类获取,下面给出的是`5.0`和`5.1`的常量对照表:
|5.0常量|5.1获取方法|
|---|---|
|EXT| 取消,固定使用 `.php`|
|IS_WIN|取消|
|IS_CLI|取消|
|DS | 使用PHP自带 `DIRECTORY_SEPARATOR`|
|ENV_PREFIX|取消,固定使用`PHP_`|
|THINK_START_TIME|`App::getBeginTime()`|
|THINK_START_MEM|`App::getBeginMem()`|
|THINK_VERSION| `App::version()`|
|THINK_PATH|`Env::get('think_path')`|
|LIB_PATH|`Env::get('think_path') . 'library/'`|
|CORE_PATH|`Env::get('think_path') . 'library/think/'`|
|APP_PATH|`Env::get('app_path')`|
|CONFIG_PATH| `Env::get('config_path')`|
|CONFIG_EXT|`App::getConfigExt()`|
|ROOT_PATH|`Env::get('root_path')`|
|EXTEND_PATH| `Env::get('root_path') . 'extend/'` |
|VENDOR_PATH| `Env::get('root_path') . 'vendor/'` |
|RUNTIME_PATH|`Env::get('runtime_path')`|
|LOG_PATH| `Env::get('runtime_path') . 'log/'` |
|CACHE_PATH| `Env::get('runtime_path') . 'cache/'` |
|TEMP_PATH| `Env::get('runtime_path'). 'temp/'` |
|MODULE_PATH|`Env::get('module_path')`|
通过`Env`类的`get`方法获取路径变量的时候不区分大小写,例如下面的写法是等效的:
~~~
Env::get('root_path');
Env::get('ROOT_PATH');
~~~
### 路由调整
原有的路由定义文件`route.php` 移动到应用目录同级的`route`目录下面,如果有定义其它的路由配置文件,一并放入`route`目录即可(无需更改文件名)。
`url_route_on`配置参数无效,会始终检查路由,没有定义路由的情况下默认解析方式依然有效。
原来的`before_behavior`和`after_behavior`参数更改为`before`和`after`,并且路由缓存功能暂时取消。
Route类的`rule`方法不再支持批量注册路由,请使用`Route::rules`方法替代。
如果使用了domain方法批量绑定模块,需要改为单独绑定,原来的用法:
~~~
Route::domain([
'a' => 'a',
'b' => 'b'
]);
~~~
需要改为:
~~~
Route::domain('a','a');
Route::domain('b','b');
~~~
### 数据库调整
* 取消了Query类的`getTableInfo`方法,可以用更加具体的`getTableFields`
或者`getFieldsType`方法替代;
* 数据库查询后`5.1`不会清空查询条件;
* 取消了`select(false)` 用法,使用 `fetchSql()->select()` 替代;
* 如果使用了mysql的JSON查询语法,`user$.name` 需要改为 `user->name`;
* 改变了查询构造器的数组多字段批量查询,从原来的
~~~
where([
'name' => ['like','think%'],
'id' => ['>',0],
])
~~~
需要调整为
~~~
where([
['name','like','think%'],
['id','>',0],
])
~~~
或者使用表达式语法
~~~
where('name','like','think%')->where('id','>',0)
~~~
对于纯等于的数组条件则无需调整
~~~php
where(['name'=>'think', 'type'=>1])
~~~
### 模型调整
为了确保模型的用法统一,对模型进行了一些调整,包括:
* 模型的数据集查询始终返回数据集对象而不再是数组;
* 模型的数据表主键如果不是`id`,则必须设置模型的`pk`属性;
* 软删除trait引入更改为 `use think\model\concern\SoftDelete`;
* 全局查询范围`base`方法中无需添加软删除条件;
* 聚合模型功能废除,使用关联模型配合关联自动写入功能替代,更灵活;
* 模型的查询范围`scope`方法调用后只能使用数据库的查询方法;
* 取消模型的数据验证功能,请使用控制器验证或者路由验证替代;
### 控制器调整
为了规范化,继承了`think\Controller`类的话,初始化方法从原来的`_initialize`方法更改为`initialize`。
`fetch`方法以及`view`助手函数的`replace`参数废弃,如果需要模板替换功能,改成template配置文件的`tpl_replace_string`配置参数。或者使用`filter`方法进行过滤。
### 验证类调整
验证规则的错误信息定义不再支持规则和错误信息定义在一起,例如:
```
namespace app\index\validate;
use think\Validate;
class User extends Validate
{
protected $rule = [
['name','require|max:25','名称必须|名称最多不能超过25个字符'],
['age','number|between:1,120','年龄必须是数字|年龄必须在1~120之间'],
['email','email','邮箱格式错误']
];
}
```
需要调整为
```
namespace app\index\validate;
use think\Validate;
class User extends Validate
{
protected $rule = [
'name' => 'require|max:25',
'age' => 'number|between:1,120',
'email' => 'email',
];
protected $message = [
'name.require' => '名称必须',
'name.max' => '名称最多不能超过25个字符',
'age.number' => '年龄必须是数字',
'age.between' => '年龄必须在1~120之间',
'email' => '邮箱格式错误',
];
}
```
### 官方扩展
官方的下列`composer`扩展请升级到最新的`2.0`版本:
~~~cmd
topthink/think-captcha
topthink/think-mongo
topthink/think-migration
topthink/think-testing
topthink/think-queue
~~~
### 其它注意事项
`Request`类不再需要`instance`方法,直接调用类的方法即可。
废弃了`Rest`控制器扩展,建议更改为资源控制器的方式。
原来内置的其它控制器扩展,请自行在应用里面扩展。
因为严格遵循`PSR-4`规范,不再建议手动导入类库文件,所以新版取消了`Loader::import`方法以及`import`和`vendor`助手函数,推荐全面采用命名空间方式的类以及自动加载机制,如果必须使用请直接改为php内置的`include`或者`require`语法。
为了保持`Loader`类库的单纯性,原`Loader`类的`controller`、`model`、`action`和`validate`方法改为`App`类的同名方法,助手函数用法保持不变。
模板的变量输出默认添加了`htmlentities`安全过滤,如果你需要输出html内容的话,请使用`{$var|raw}`方式替换,并且`date`方法已经做了内部封装,无需再使用`###`变量替换了。
>[danger]### 最后一个步骤不要忘了:清空缓存目录下的所有文件
';
助手函数
最后更新于:2022-04-02 01:55:37
>[info] 在5.1版本中,大部分的助手函数都可以归结为一个函数`app()`,因为5.1全面采用容器管理类的实例,而`app()`函数又是容器的“管家”。
## 助手函数
系统为一些常用的操作方法封装了助手函数,便于使用,包含如下:
|助手函数|描述|
|---|---|
|abort|中断执行并发送HTTP状态码|
|action|调用控制器类的操作|
|app|快速获取容器中的实例 支持依赖注入|
|behavior|执行某个行为|
|bind|快速绑定对象实例|
|cache|缓存管理|
|call|调用反射执行callable 支持依赖注入|
|class_basename|获取类名(不包含命名空间)|
|class_uses_recursive|获取一个类里所有用到的trait|
|config|获取和设置配置参数|
|container|获取容器对象实例|
|controller|实例化控制器|
|cookie|Cookie管理|
|db|实例化数据库类|
|debug|调试时间和内存占用|
|dump|浏览器友好的变量输出|
|env|获取环境变量(`V5.1.3+`)|
|exception | 抛出异常处理|
|halt|变量调试输出并中断执行|
|input|获取输入数据 支持默认值和过滤|
|json|JSON数据输出|
|jsonp|JSONP数据输出|
|lang|获取语言变量值|
|model|实例化Model|
|parse_name|字符串命名风格转换|
|redirect|重定向输出|
|request|实例化Request对象|
|response|实例化Response对象|
|route|注册路由规则(`V5.1.3+`)|
|session|Session管理|
|token|生成表单令牌输出|
|trace|记录日志信息|
|trait_uses_recursive|获取一个trait里所有引用到的trait|
|url|Url生成|
|validate|实例化验证器|
|view|渲染模板输出|
|widget|渲染输出Widget|
|xml|XML数据输出|
>[danger] 核心框架不依赖任何助手函数,系统只是加载了助手函数文件,而且你可以在应用的公共函数文件(模块公共函数文件中重写无效)中重写上面这些助手函数。
上面这些内置的系统助手函数大部分方法都可以通过`app`助手函数完成调用,以进行缓存操作为例。
~~~php
cache('name');
// 可以使用
app('cache')->get('name');
cache('name','value');
// 可以使用
app('cache')->set('name','value');
~~~
~~~
model('User');
可以使用
app()->model('User');
~~~
具体可以参考架构->容器和依赖注入。
> `V5.1.3+`版本开始,所有的助手函数都可以直接用于配置文件。
';
附录
最后更新于:2022-04-02 01:55:35
[助手函数](%E5%8A%A9%E6%89%8B%E5%87%BD%E6%95%B0.md)
[升级指导](%E5%8D%87%E7%BA%A7%E6%8C%87%E5%AF%BC.md)
[更新日志](%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97.md)
';
优化建议
最后更新于:2022-04-02 01:55:33
架构及开发过程优化建议:
* 路由尽量使用域名路由或者路由分组;
* 在路由中进行验证和权限判断;
* 合理规划数据表字段类型及索引;
* 结合业务逻辑使用数据缓存,减少数据库压力;
在应用完成部署之后,建议对应用进行相关优化,包括:
* 如果开发过程中开启了调试模式的话,关闭调试模式(参考调试模式);
* 通过命令行生成类库映射文件;
* 通过命令行生成配置缓存文件;
* 生成数据表字段缓存文件;
';
安全建议
最后更新于:2022-04-02 01:55:30
## 输入安全
虽然ThinkPHP的底层安全防护比之前版本要强大不少,但永远不要相信用户提交的数据,建议务必遵守下面规则:
* 设置`public`目录为唯一对外访问目录,不要把资源文件放入应用目录;
* 开启表单令牌验证避免数据的重复提交,能起到`CSRF`防御作用;
* 使用框架提供的请求变量获取方法(Request类`param`方法及`input`助手函数)而不是原生系统变量获取用户输入数据;
* 对不同的应用需求设置`default_filter`过滤规则(**默认没有任何过滤规则**),常见的安全过滤函数包括`stripslashes`、`htmlentities`、`htmlspecialchars`和`strip_tags`等,请根据业务场景选择最合适的过滤方法;
* 使用[验证类](354101)对业务数据设置必要的验证规则;
* 如果可能开启强制路由或者设置MISS路由规则,严格规范每个URL请求;
## 数据库安全
在确保用户请求的数据安全之后,数据库的安全隐患就已经很少了,因为数据操作默认使用了PDO预处理机制及自动参数绑定功能,请确保:
* 尽量少使用字符串查询条件,如果不得已的情况下 使用手动参数绑定功能;
* 不要让用户输入决定要查询或者写入的字段;
* 不要让用户输入决定你的字段排序;
* 对于敏感数据在输出的时候使用`hidden`方法进行隐藏;
* 对于数据的写入操作应当做好权限检查工作;
* 写入数据严格使用`field`方法限制写入字段;
* 对于需要输出到页面的数据做好必要的`XSS`过滤;
>[danger] 如果你使用的是`V5.1.10`以下版本,建议尽快更新到该版本(或者以上版本)
>
## 上传
网站的上传功能也是一个非常容易被攻击的入口,所以对上传功能的安全检查是尤其必要的。
系统的`think\File`提供了文件上传的安全支持,包括对文件后缀、文件类型、文件大小以及上传图片文件的合法性检查,确保你已经在上传操作中启用了这些合法性检查。
## 其它的一些安全建议:
* 对所有公共的操作方法做必要的安全检查,防止用户通过URL直接调用;
* 不要缓存需要用户认证的页面;
* 对用户的上传文件,做必要的安全检查,例如上传路径和非法格式;
* 对于项目进行充分的测试,不要生成业务逻辑的安全隐患(这可能是最大的安全问题);
* 最后一点,做好服务器的安全防护,安全问题的关键其实是找到你的最薄弱环节;
>[danger] 最后一点,及时关注官方安全更新,并更新到官方建议的安全版本,建议更新`V5.1.10+`版本,该版本包含安全更新。
';
安全和性能
最后更新于:2022-04-02 01:55:28
[安全建议](%E8%BE%93%E5%85%A5%E5%AE%89%E5%85%A8.md)
[优化建议](%E6%95%B0%E6%8D%AE%E5%BA%93%E5%AE%89%E5%85%A8.md)
';
单元测试
最后更新于:2022-04-02 01:55:26
## 单元测试
首先安装`ThinkPHP5`的单元测试扩展,进入命令行,切换到tp5的应用根目录下面,执行:
~~~
composer require topthink/think-testing=2.0.*
~~~
> 由于单元测试扩展的依赖较多,因此安装过程会比较久,请耐心等待。
安装完成后,会在应用根目录下面增加`tests`目录和`phpunit.xml`文件。
默认带了一个`tests/ExampleTest.php`单元测试文件,我们可以直接在命令行下面运行单元测试:
~~~
php think unit
~~~
>[danger] 请始终使用以上命令进行单元测试,而不是直接用`phpunit`来运行单元测试。
## 添加单元测试文件
我们来添加一个新的单元测试文件,单元测试文件为`tests/IndexTest.php`,内容如下:
~~~
assertTrue(true);
}
}
~~~
>[danger] 注意,单元测试文件中定义的测试类如果不存在冲突,可以不需要使用命名空间。
';
MongoDb
最后更新于:2022-04-02 01:55:23
使用`Mongo`之前,需要装PHP的`mongo`扩展,访问 http://pecl.php.net/package/mongodb ,选择最新的版本即可,然后选择你的PHP版本对应的扩展。
然后使用`Composer`安装扩展包:
~~~
composer require topthink/think-mongo=2.0.*
~~~
接下来,需要修改数据库配置文件中的相关参数:
~~~
// 数据库类型
'type' => '\think\mongo\Connection',
// 设置查询类
'query' => '\think\mongo\Query',
// 服务器地址
'hostname' => '127.0.0.1',
// 集合名
'database' => 'demo',
// 用户名
'username' => '',
// 密码
'password' => '',
// 端口
'hostport' => '',
~~~
默认安装的`mongodb`是没有用户名和密码的,可以留空。如果你的服务器安装的mongodb提供了用户名和密码认证,请自行修改。`MongoDb`一样支持分布式设置,设置方法和`Mysql`的分布式设置一致。
## 关于主键
`MongoDb`会自动添加`_id`字段而且作为主键,该主键数据是一个`MongoDB\BSON\ObjectID`对象实例。
为了方便查询,系统做了封装,该主键的值可以直接当作字符串使用,因此下面的查询是有效的:
~~~
// 查询操作
$user = Db::table('user')
->where('_id','589461c0fc122812b4007411')
->find();
// 或者直接使用
$user = Db::table('user')
->find('589461c0fc122812b4007411');
~~~
为了保持和Mysql一致的主键命名习惯,系统提供了一个数据库配置参数`pk_convert_id`可以强制把`_id`转换为`id`进行操作。
~~~
// 强制把_id转换为id
'pk_convert_id' => true,
~~~
设置后,就可以把`id`当成`_id`来使用
~~~
// 查询操作
$user = Db::table('user')
->where('id','589461c0fc122812b4007411')
->find();
dump($user);
~~~
输出结果为:
~~~
array (size=3)
'name' => string 'thinkphp' (length=8)
'email' => string 'thinkphp@qq.com' (length=15)
'id' => string '589461c0fc122812b4007411' (length=24)
~~~
原来的`_id`已经变成`id`,而且是一个字符串类型。
## 方法变化和差异
除了常规的CURD方法之外,包括`value`、`column`、`setInc`、`setDec`、`setField`、`paginate`等方法仍然被支持,更新的时候也支持`data`、`inc`和`dec`方法,包括聚合查询方法也都支持。
由于数据库自身的原因,以下链式方法在`MongoDb`中不再支持(或者无效):
|不再支持的方法|
|---|
|view|
|join|
|alias|
|group|
|having|
|union|
|lock|
|strict|
|sequence|
|force|
|bind|
|partition|
针对了`MongoDb`的特殊性增加了如下链式操作方法:
|方法|描述|
|---|---|
|skip|设置skip|
|awaitData|设置awaitData|
|batchSize|设置batchSize|
|exhaust|设置exhaust|
|modifiers|设置modifiers|
|noCursorTimeout|设置noCursorTimeout|
|oplogReplay|设置oplogReplay|
|partial|设置partial|
|maxTimeMS|设置maxTimeMS|
|slaveOk|设置slaveOk|
|tailable|设置tailable|
|writeConcern|设置writeConcern|
并且`fetchPdo`方法改为`fetchCursor`。
## Mongo原生查询
系统提供了几个基础查询方法,仅供熟悉`MongoDb`语法的用户使用。
>[info] ### query ($collection, $query)
**collection**:表示当前查询的集合
**query**:是一个`\MongoDB\Driver\Query`对象,详细用法可以参考[官方手册](http://php.net/manual/zh/mongodb-driver-query.construct.php)
代码示例如下
~~~
$filter = [
'author' => 'bjori',
'views' => [
'$gte' => 100,
],
];
$options = [
/* Only return the following fields in the matching documents */
'projection' => [
'title' => 1,
'article' => 1,
],
/* Return the documents in descending order of views */
'sort' => [
'views' => -1
],
);
$query = new MongoDB\Driver\Query($filter, $options);
Db::query('demo.user', $query);
~~~
>[info] ### execute ($collection, $bulk)
**collection**:表示当前查询的集合
**bulk**:是一个`\MongoDB\Driver\BulkWrite`对象,详细用法可以参考[官方手册](http://php.net/manual/zh/class.mongodb-driver-bulkwrite.php)
>[info] ### command ($command, $dbName)
**command**:是一个`\MongoDB\Driver\Command`对象,详细用法参考[官方手册](http://php.net/manual/zh/class.mongodb-driver-command.php)
**dbName**:当前操作的数据库名称,留空表示当前数据库
除此之外,系统还封装了一个`cmd`方法可以直接执行字符串格式的`mongo`命令,例如:
~~~
// 列出当前的集合
$collections = Db::cmd('listCollections');
~~~
更多的`mongo`命令参考`MongoDb`官方手册。
';
Workerman
最后更新于:2022-04-02 01:55:21
## Workerman
> Workerman是一款纯PHP开发的开源高性能的PHP socket 服务器框架。被广泛的用于手机app、手游服务端、网络游戏服务器、聊天室服务器、硬件通讯服务器、智能家居、车联网、物联网等领域的开发。 支持TCP长连接,支持Websocket、HTTP等协议,支持自定义协议。基于workerman开发者可以更专注于业务逻辑开发,不必再为PHP Socket底层开发而烦恼。
## 安装
首先通过 composer 安装
~~~
composer require topthink/think-worker=2.0.*
~~~
## 使用
### 使用`Workerman`作为`HttpServer`
在命令行启动服务端(需要`2.0+`版本)
~~~
php think worker
~~~
然后就可以通过浏览器直接访问当前应用
~~~
http://localhost:2346
~~~
linux下面可以支持下面指令
~~~
php think worker [start|stop|reload|restart|status]
~~~
`workerman`的参数可以在应用配置目录下的`worker.php`里面配置。
> 由于`onWorkerStart`运行的时候没有`HTTP_HOST`,因此最好在应用配置文件中设置`app_host`
### SocketServer
在命令行启动服务端(需要`2.0.5+`版本)
~~~
php think worker:server
~~~
默认会在0.0.0.0:2345开启一个`websocket`服务。
如果需要自定义参数,可以在`config/worker_server.php`中进行配置,包括:
配置参数 | 描述
--- | ---
protocol| 协议
host | 监听地址
port | 监听端口
socket | 完整的socket地址
并且支持`workerman`所有的参数(包括全局静态参数)。
也支持使用闭包方式定义相关事件回调。
~~~
return [
'socket' => 'http://127.0.0.1:8000',
'name' => 'thinkphp',
'count' => 4,
'onMessage' => function($connection, $data) {
$connection->send(json_encode($data));
},
];
~~~
也支持使用自定义类作为`Worker`服务入口文件类。例如,我们可以创建一个服务类(必须要继承 `think\worker\Server`),然后设置属性和添加回调方法
~~~
send(json_encode($data));
}
}
~~~
支持`workerman`所有的回调方法定义(回调方法必须是public类型)
然后在`worker_server.php`中增加配置参数:
~~~
return [
'worker_class' => 'app\http\Worker',
];
~~~
定义该参数后,其它配置参数均不再有效。
在命令行启动服务端
~~~
php think worker:server
~~~
然后在浏览器里面访问
~~~
http://localhost:2346
~~~
如果在Linux下面,同样支持reload|restart|stop|status 操作
~~~
php think worker:server reload
~~~
';
Swoole
最后更新于:2022-04-02 01:55:19
## Swoole
> Swoole是一个面向生产环境的 PHP 异步网络通信引擎。使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。
## 安装
首先按照Swoole官网说明安装`swoole`扩展,然后安装`think-swoole`扩展。
~~~
composer require topthink/think-swoole=2.0.*
~~~
>[danger] Swoole目前不支持Windows
## 使用
### 使用`Swoole`作为`HttpServer`
命令行下启动服务端(需要`2.0+`版本`think-swoole`扩展)
直接在命令行下启动服务端。
~~~
php think swoole
~~~
启动完成后,会在0.0.0.0:9501启动一个HTTP Server,可以直接访问当前的应用。
swoole的参数可以在应用配置目录下的swoole.php里面配置(具体参考配置文件内容)。
如果需要使用守护进程方式运行,可以使用
~~~
php think swoole -d
~~~
或者在swoole.php文件中设置
~~~
'daemonize' => true
~~~
注意:由于onWorkerStart运行的时候没有HTTP_HOST,因此最好在应用配置文件中设置app_host
支持的操作包括
~~~
php think swoole [start|stop|reload|restart]
~~~
> 由于`onWorkerStart`运行的时候没有`HTTP_HOST`,因此最好在应用配置文件中设置`app_host`参数
启动后,可以使用
~~~
http://127.0.0.1:9501
~~~
访问你的应用。
如果需要配置地址和端口,可以在应用配置目录下增加
`swoole.php`配置文件,然后设置:
~~~
'tp5.com',
'port' => 9508,
];
~~~
可以支持`Swoole`自身的配置参数设置,例如:
~~~
'tp5.com',
'port' => 9508,
'worker_num' => 4,
'max_request' => 1000,
];
~~~
扩展中定义了`onWorkerStart`和`onRequest`事件回调方法(如果不熟悉请不要随意替换),如果你需要自定义`swoole`的事件回调方法,可以在配置文件中使用闭包定义。
~~~
'tp5.com',
'port' => 9508,
'worker_num' => 4,
'max_request' => 1000,
'WorkerStop' => function($server, $worker_id){
// 添加你的代码
},
];
~~~
或者直接在配置文件中添加
### 使用`Swoole`作为`Server`服务端
可以支持直接启动一个Swoole server(需要`2.0.9+`版本)
~~~
php think swoole:server
~~~
会在0.0.0.0:9508启动一个Websocket服务。
如果需要自定义参数,可以在config/swoole_server.php中进行配置,包括:
配置参数 | 描述
--- | ---
type| 服务类型
host | 监听地址
port | 监听端口
mode | 运行模式
socket_type | Socket type
并且支持swoole所有的参数。
也支持使用闭包方式定义相关事件回调。
~~~
return [
// 扩展自身配置
'host' => '0.0.0.0', // 监听地址
'port' => 9501, // 监听端口
'type' => 'socket', // 服务类型 支持 socket http server
'mode' => SWOOLE_PROCESS,
'socket_type' => SWOOLE_SOCK_TCP,
// 可以支持swoole的所有配置参数
'daemonize' => false,
// 事件回调定义
'onOpen' => function ($server, $request) {
echo "server: handshake success with fd{$request->fd}\n";
},
'onMessage' => function ($server, $frame) {
echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
$server->push($frame->fd, "this is server");
},
'onRequest' => function ($request, $response) {
$response->end("
';
Hello Swoole. #" . rand(1000, 9999) . "
"); }, 'onClose' => function ($ser, $fd) { echo "client {$fd} closed\n"; }, ]; ~~~ 也可以使用自定义的服务类 ~~~ 4, 'daemonize' => true, 'backlog' => 128 ]; public function onReceive($server, $fd, $from_id, $data) { $server->send($fd, 'Swoole: '.$data); } } ~~~ 支持swoole所有的回调方法定义(回调方法必须是public类型) serverType 属性定义为 socket或者http 则支持swoole的swoole_websocket_server和swoole_http_server 然后在swoole_server.php中增加配置参数: ~~~ return [ 'swoole_class' => 'app\http\Swoole', ]; ~~~ 定义该参数后,其它配置参数均不再有效。 在命令行启动服务端 ~~~ php think swoole:server ~~~ 支持reload|restart|stop|status 操作 ~~~ php think swoole:server reload ~~~数据库迁移工具
最后更新于:2022-04-02 01:55:17
## 数据库迁移工具
首先通过 composer 安装
~~~
composer require topthink/think-migration=2.0.*
~~~
注意事项,不支持修改文件配置目录
***
在命令行下运行查看帮助,可以看到新增的命令
~~~
php think
~~~
~~~
migrate
migrate:create Create a new migration
migrate:rollback Rollback the last or to a specific migration
migrate:run Migrate the database
migrate:status Show migration status
optimize
optimize:autoload Optimizes PSR0 and PSR4 packages to be loaded wit
h classmaps too, good for production.
optimize:config Build config and common file cache.
optimize:route Build route cache.
optimize:schema Build database schema cache.
seed
seed:create Create a new database seeder
seed:run Run database seeders
~~~
创建迁移类,首字母必须为大写
~~~
php think migrate:create Users
~~~
可以看到目录下有新文件 .\database\migrations\20161117144043_users.php
#### 使用实例
~~~
table('users',array('engine'=>'MyISAM'));
$table->addColumn('username', 'string',array('limit' => 15,'default'=>'','comment'=>'用户名,登陆使用'))
->addColumn('password', 'string',array('limit' => 32,'default'=>md5('123456'),'comment'=>'用户密码'))
->addColumn('login_status', 'boolean',array('limit' => 1,'default'=>0,'comment'=>'登陆状态'))
->addColumn('login_code', 'string',array('limit' => 32,'default'=>0,'comment'=>'排他性登陆标识'))
->addColumn('last_login_ip', 'integer',array('limit' => 11,'default'=>0,'comment'=>'最后登录IP'))
->addColumn('last_login_time', 'datetime',array('default'=>0,'comment'=>'最后登录时间'))
->addColumn('is_delete', 'boolean',array('limit' => 1,'default'=>0,'comment'=>'删除状态,1已删除'))
->addIndex(array('username'), array('unique' => true))
->create();
}
/**
* Migrate Up.
*/
public function up()
{
}
/**
* Migrate Down.
*/
public function down()
{
}
}
~~~
对于同一个数据表,如果需要新的迁移动作,例如删除字段、创建字段,可以创建新的更改文件,像svn一样往前记录操作,方便回滚。
更具体的使用可查看
http://docs.phinx.org/en/latest/
';
Time
最后更新于:2022-04-02 01:55:14
## 时间戳操作
首先通过 composer 安装
~~~
composer require topthink/think-helper=1.0.*
~~~
在文件头部引入
~~~
use think\helper\Time;
~~~
比如需要获得今天的零点时间戳和23点59分59秒的时间戳
~~~
list($start, $end) = Time::today();
echo $start; // 零点时间戳
echo $end; // 23点59分59秒的时间戳
~~~
完整示例如下:
~~~
// 今日开始和结束的时间戳
Time::today();
// 昨日开始和结束的时间戳
Time::yesterday();
// 本周开始和结束的时间戳
Time::week();
// 上周开始和结束的时间戳
Time::lastWeek();
// 本月开始和结束的时间戳
Time::month();
// 上月开始和结束的时间戳
Time::lastMonth();
// 今年开始和结束的时间戳
Time::year();
// 去年开始和结束的时间戳
Time::lastYear();
// 获取7天前零点到现在的时间戳
Time::dayToNow(7)
// 获取7天前零点到昨日结束的时间戳
Time::dayToNow(7, true)
// 获取7天前的时间戳
Time::daysAgo(7)
// 获取7天后的时间戳
Time::daysAfter(7)
// 天数转换成秒数
Time::daysToSecond(5)
// 周数转换成秒数
Time::weekToSecond(5)
~~~
';
图像处理
最后更新于:2022-04-02 01:55:12
## 安装扩展
使用`Composer`安装`ThinkPHP5`的图像处理类库:
~~~
composer require topthink/think-image
~~~
## 图像操作
下面来看下图像操作类的基础方法。
### 打开图像文件
假设当前入口文件目录下面有一个`image.png`文件,如图所示:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/88e25fed9c22b2333334799f8484f952_768x432.png)
使用`open`方法打开图像文件进行相关操作:
~~~
$image = \think\Image::open('./image.png');
~~~
也可以从直接获取当前请求中的文件上传对象,例如:
~~~
$image = \think\Image::open(request()->file('image'));
~~~
### 获取图像信息
可以获取打开图片的信息,包括图像大小、类型等,例如:
~~~
$image = \think\Image::open('./image.png');
// 返回图片的宽度
$width = $image->width();
// 返回图片的高度
$height = $image->height();
// 返回图片的类型
$type = $image->type();
// 返回图片的mime类型
$mime = $image->mime();
// 返回图片的尺寸数组 0 图片宽度 1 图片高度
$size = $image->size();
~~~
### 裁剪图片
使用`crop`和`save`方法完成裁剪图片功能。
~~~
$image = \think\Image::open('./image.png');
//将图片裁剪为300x300并保存为crop.png
$image->crop(300, 300)->save('./crop.png');
~~~
生成的图片如图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/b46e4b15f928daf684058dff7077d0af_300x300.png)
支持从某个坐标开始裁剪,例如下面从(100,30)开始裁剪,例如:
~~~
$image = \think\Image::open('./image.png');
//将图片裁剪为300x300并保存为crop.png
$image->crop(300, 300,100,30)->save('./crop.png');
~~~
生成的图片如图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/b46e4b15f928daf684058dff7077d0af_300x300.png)
### 生成缩略图
使用`thumb`方法生成缩略图,例如:
~~~
$image = \think\Image::open('./image.png');
// 按照原图的比例生成一个最大为150*150的缩略图并保存为thumb.png
$image->thumb(150, 150)->save('./thumb.png');
~~~
生成的缩略图如图所示:
[](image/5785e5409cab2.png)
我们看到实际生成的缩略图并不是150*150,因为默认采用原图等比例缩放的方式生成缩略图,最大宽度是150。
可以支持其他类型的缩略图生成,设置包括`\think\Image`的下列常量或者对应的数字:
~~~
//常量,标识缩略图等比例缩放类型
const THUMB_SCALING = 1;
//常量,标识缩略图缩放后填充类型
const THUMB_FILLED = 2;
//常量,标识缩略图居中裁剪类型
const THUMB_CENTER = 3;
//常量,标识缩略图左上角裁剪类型
const THUMB_NORTHWEST = 4;
//常量,标识缩略图右下角裁剪类型
const THUMB_SOUTHEAST = 5;
//常量,标识缩略图固定尺寸缩放类型
const THUMB_FIXED = 6;
~~~
比如我们居中裁剪:
~~~
$image = \think\Image::open('./image.png');
// 按照原图的比例生成一个最大为150*150的缩略图并保存为thumb.png
$image->thumb(150,150,\think\Image::THUMB_CENTER)->save('./thumb.png');
~~~
后生成的缩略图效果如图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/9f0c37dc57cc38fccb00dbecca801013_150x150.png)
再比如我们右下角剪裁
~~~
$image = \think\Image::open('./image.png');
// 按照原图的比例生成一个最大为150*150的缩略图并保存为thumb.png
$image->thumb(150,150,\think\Image::THUMB_SOUTHEAST)->save('./thumb.png');
~~~
生成的缩略图效果如图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/144414432d50e94938754a8f775c69af_150x150.png)
这里就不再对其他用法一一举例了。
### 图像翻转
使用`flip`可以对图像进行翻转操作,默认是以x轴进行翻转,例如:
~~~
$image = \think\Image::open('./image.png');
// 对图像进行以x轴进行翻转操作
$image->flip()->save('./filp_image.png');
~~~
生成的效果如图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-07-23_579366dfb73f3.png)
我们也可以改变参数,以y轴进行翻转,例如:
~~~
$image = \think\Image::open('./image.png');
// 对图像进行以y轴进行翻转操作
$image->flip(\think\image::FLIP_Y)->save('./filp_image.png');
~~~
生成的效果如图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-07-23_579366e000540.png)
>[info]图像的翻转可以理解为图像的镜面效果与图像旋转有所不同。
### 图像旋转
使用`rotate`可以对图像进行旋转操作(默认是顺时针旋转90度),我们用默认90度进行旋转举例:
~~~
$image = \think\Image::open('./image.png');
// 对图像使用默认的顺时针旋转90度操作
$image->rotate()->save('./rotate_image.png');
~~~
生成的效果如图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/9e926b44ae235cdf8b9a635297e4a786_432x767.png)
### 图像保存参数
`save`方法可以配置的参数
| 参数 | 默认 | 描述 |
| -- | -- | -- |
| pathname | 必填项 | 图像保存路径名称 |
| type | 默认与原图相同 | 图像类型 |
| quality | 80 | 图像质量 |
| interlace | true | 是否对JPEG类型图像设置隔行扫描 |
>[info]设置隔行扫描的情况下在网页进行浏览时。是从上到下一行一行的显示,否则图片整个显示出来 然后由模糊到清晰显示。
### 添加水印
系统支持添加图片及文字水印,下面依次举例说明
添加图片水印,我们下载官网logo文件到根目录进行举例:
~~~
$image = \think\Image::open('./image.png');
// 给原图左上角添加水印并保存water_image.png
$image->water('./logo.png')->save('water_image.png');
~~~
`water`方法的第二个参数表示水印的位置,默认值是`WATER_SOUTH`,可以传入下列`\think\Image`类的常量或者对应的数字:
~~~
//常量,标识左上角水印
const WATER_NORTHWEST = 1;
//常量,标识上居中水印
const WATER_NORTH = 2;
//常量,标识右上角水印
const WATER_NORTHEAST = 3;
//常量,标识左居中水印
const WATER_WEST = 4;
//常量,标识居中水印
const WATER_CENTER = 5;
//常量,标识右居中水印
const WATER_EAST = 6;
//常量,标识左下角水印
const WATER_SOUTHWEST = 7;
//常量,标识下居中水印
const WATER_SOUTH = 8;
//常量,标识右下角水印
const WATER_SOUTHEAST = 9;
~~~
我们用左上角来进行测试:
~~~
$image = \think\Image::open('./image.png');
// 给原图左上角添加水印并保存water_image.png
$image->water('./logo.png',\think\Image::WATER_NORTHWEST)->save('water_image.png');
~~~
生成的图片效果如下:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/30d6a32b977c060bf6f4996053e5bca7_768x432.png)
还可以支持水印图片的透明度(0~100,默认值是100),例如:
~~~
$image = \think\Image::open('./image.png');
// 给原图左上角添加透明度为50的水印并保存alpha_image.png
$image->water('./logo.png',\think\Image::WATER_NORTHWEST,50)->save('alpha_image.png');
~~~
生成的图片效果如下:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/67fb22eaa6b1f2c1325d498d2ecadbe9_768x432.png)
也可以支持给图片添加文字水印(我们复制一个字体文件`HYQingKongTiJ.ttf`到入口目录),我们现在生成一个像素20px,颜色为`#ffffff`的水印效果:
~~~
$image = \think\Image::open('./image.png');
// 给原图左上角添加水印并保存water_image.png
$image->text('十年磨一剑 - 为API开发设计的高性能框架','HYQingKongTiJ.ttf',20,'#ffffff')->save('text_image.png');
~~~
生成的图片效果:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/a38f1ee79cfbce71d6ddc50959a35c92_768x432.png)
### 文字水印参数
文字水印比较多,在此只做说明不做演示了
| 参数 | 默认 | 描述 |
| -- | -- | -- |
| text | 不能为空 | 添加的文字 |
| font | 不能为空 | 字体文件路径 |
| size | 不能为空 | 字号,单位是像素 |
| color | #00000000 | 文字颜色 |
| locate | WATER_SOUTHEAST | 文字写入位置 |
| offset | 0 | 文字相对当前位置的偏移量 |
| angle | 0 | 文字倾斜角度 |
';
验证码
最后更新于:2022-04-02 01:55:10
首先使用`Composer`安装`think-captcha`扩展包:
~~~
composer require topthink/think-captcha=2.0.*
~~~
## 验证码的简单用法
扩展包内定义了一些常见用法方便使用,可以满足大部分常用场景,以下示例说明。
在模版内添加验证码的显示代码
~~~
~~~
>[info]上面两种的最终效果是一样的,根据需要调用即可。
然后使用框架的内置验证功能(具体可以参考验证章节),添加`captcha`验证规则即可
~~~
$this->validate($data,[
'captcha|验证码'=>'require|captcha'
]);
~~~
如果没有使用内置验证功能,则可以调研内置的函数手动验证
~~~php
if(!captcha_check($captcha)){
// 验证失败
};
~~~
## 验证码的自定义用法
如果需要自己独立生成验证码,可以调用`Captcha`类(`think\captcha\Captcha`)操作。
在控制器中使用下面的代码进行验证码生成:
~~~
entry();
}
}
~~~
然后访问下面的地址就可以显示验证码:
~~~
http://serverName/index/index/verify
~~~
输出效果如图
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/dcbf30b119dc2bb7ec6f41d943b5646c_250x62.png)
通常可以给验证码地址注册路由
~~~
Route::get('verify','index/verify');
~~~
在模板中就可以使用下面的代码显示验证码图片
~~~html
~~~
如果你需要在一个页面中生成多个验证码的话,`entry`方法需要传入可标识的信息(数字或者字符串),例如:
~~~
$captcha = new Captcha();
return $captcha->entry(1);
~~~
可以用`Captcha`类的`check`方法检测验证码的输入是否正确,
~~~
// 检测输入的验证码是否正确,$value为用户输入的验证码字符串
$captcha = new Captcha();
if( !$captcha->check($value))
{
// 验证失败
}
~~~
或者直接调用封装的一个验证码检测的函数`captcha_check`
~~~php
// 检测输入的验证码是否正确,$value为用户输入的验证码字符串
if( !captcha_check($value ))
{
// 验证失败
}
~~~
如果你在页面上同时生成了多个验证码,则可以使用
~~~php
// 检测输入的验证码是否正确,$value为用户输入的验证码字符串,$id为验证码标识
if( !captcha_check($value, $id ))
{
// 验证失败
}
~~~
## 验证码的配置参数
`Captcha`类带有默认的配置参数,支持自定义配置。这些参数包括:
| 参数 | 描述 | 默认 |
| --- | --- | --- |
| codeSet | 验证码字符集合 | 略 |
| expire | 验证码过期时间(s) | 1800 |
| useZh | 使用中文验证码 | false |
| zhSet | 中文验证码字符串 | 略 |
| useImgBg | 使用背景图片 | false |
| fontSize | 验证码字体大小(px) | 25 |
| useCurve | 是否画混淆曲线 | true |
| useNoise | 是否添加杂点 | true |
| imageH | 验证码图片高度,设置为0为自动计算 | 0 |
| imageW | 验证码图片宽度,设置为0为自动计算 | 0 |
| length | 验证码位数 | 5 |
| fontttf | 验证码字体,不设置是随机获取 | 空 |
| bg | 背景颜色 | [243, 251, 254] |
| reset | 验证成功后是否重置 | true |
>[danger] 如果使用扩展内置的方法进行验证码显示,直接在应用的`config`目录下面的`captcha.php`文件(没有则首先创建)中进行设置即可,以下设置方式仅限于独立调用Captcha类的时候使用。
实例化传入参数:
~~~
$config = [
// 验证码字体大小
'fontSize' => 30,
// 验证码位数
'length' => 3,
// 关闭验证码杂点
'useNoise' => false,
];
$captcha = new Captcha($config);
return $captcha->entry();
~~~
或者采用动态设置的方式,如:
~~~
$captcha = new Captcha();
$captcha->fontSize = 30;
$captcha->length = 3;
$captcha->useNoise = false;
return $captcha->entry();
~~~
### 验证码字体
默认情况下,验证码的字体是随机使用扩展包内 `think-captcha/assets/ttfs`目录下面的字体文件,我们可以指定验证码的字体,例如:
~~~
$captcha = new Captcha();
$captcha->fontttf = '5.ttf';
return $captcha->entry();
~~~
### 背景图片
支持验证码背景图片功能,可以如下设置:
~~~
$captcha = new Captcha();
// 开启验证码背景图片功能 随机使用扩展包内`think-captcha/assets/bgs`目录下面的图片
$captcha->useImgBg = true;
return $captcha->entry();
~~~
### 中文验证码
如果要使用中文验证码,可以设置:
~~~
$captcha = new Captcha();
// 使用中文验证码(字体使用扩展包内`think-captcha/assets/zhttfs`字体文件)
$captcha->useZh = true;
return $captcha->entry();
~~~
### 指定验证码字符
指定验证码的字符,可以设置:
~~~
$captcha = new Captcha();
// 设置验证码字符为纯数字
$captcha->codeSet = '0123456789';
return $captcha->entry();
~~~
如果是中文验证码,可以使用`zhSet`参数设置,例如:
~~~
$captcha = new Captcha();
$captcha->useZh = true;
// 设置验证码字符
$captcha->zhSet = '们以我到他会作时要动国产的一是工就年阶义发成部民可出能方进在了不和有大这';
return $captcha->entry();
~~~
>[info] 默认的验证码字符已经剔除了易混淆的`1l0o`等字符
';
{:captcha_img()}
~~~
或者
~~~
扩展库
最后更新于:2022-04-02 01:55:08
下面的扩展非核心内置,需要单独通过`composer`安装。
';
自定义指令
最后更新于:2022-04-02 01:55:05
## 创建自定义指令
第一步,创建一个自定义命令类文件,新建`application/common/command/Hello.php`
~~~
setName('hello')
->addArgument('name', Argument::OPTIONAL, "your name")
->addOption('city', null, Option::VALUE_REQUIRED, 'city name')
->setDescription('Say Hello');
}
protected function execute(Input $input, Output $output)
{
$name = trim($input->getArgument('name'));
$name = $name ?: 'thinkphp';
if ($input->hasOption('city')) {
$city = PHP_EOL . 'From ' . $input->getOption('city');
} else {
$city = '';
}
$output->writeln("Hello," . $name . '!' . $city);
}
}
~~~
这个文件定义了一个叫`hello`的命令,并设置了一个`name`参数和一个`city`选项。
第二步,配置`application/command.php`文件
~~~
'app\common\command\Hello',
];
~~~
第三步,测试-命令帮助-命令行下运行
~~~
php think
~~~
输出
~~~cmd
Think Console version 0.1
Usage:
command [options] [arguments]
Options:
-h, --help Display this help message
-V, --version Display this console version
-q, --quiet Do not output any message
--ansi Force ANSI output
--no-ansi Disable ANSI output
-n, --no-interaction Do not ask any interactive question
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
Available commands:
build Build Application Dirs
clear Clear runtime file
hello Say Hello
help Displays help for a command
list Lists commands
make
make:controller Create a new resource controller class
make:model Create a new model class
optimize
optimize:autoload Optimizes PSR0 and PSR4 packages to be loaded with classmaps too, good for production.
optimize:config Build config and common file cache.
optimize:schema Build database schema cache.
~~~
第四步,运行`hello`命令
~~~cmd
php think hello
~~~
输出
~~~
Hello thinkphp!
~~~
添加命令参数
~~~cmd
php think hello liuchen
~~~
输出
~~~
Hello liuchen!
~~~
添加`city`选项
~~~cmd
php think hello liuchen --city shanghai
~~~
输出
~~~
Hello thinkphp!
From shanghai
~~~
>[danger] 注意看参数和选项的调用区别
>
## 在控制器中调用命令
支持在控制器的操作方法中直接调用命令,例如:
~~~
fetch();
}
}
~~~
访问该操作方法后,例如:
~~~
http://tp5.com/index/index/hello/name/thinkphp
~~~
页面会输出
~~~
Hello thinkphp!
~~~
> 一旦在控制器中调用命令,并不会生成cli命令行日志,而是在普通的web日志中记录。
>
## 快速生成指令(`V5.1.24+`)
`V5.1.24+`版本开始,你可以通过命令行指令快速生成一条指令,包括指令类文件,例如:
~~~
php think make:command First first
~~~
`First`表示类名,实际生成的指令类则是`app\command\First`(自动生成的指令类的命名空间默认都是 `app\command`)。
`first`表示指令名,建议统一使用小写,如果不传入该参数,则默认用类名的小写作为指令名。
为了让指令可以无需定义自动调用,需要在你的应用配置的`console.php`配置文件中,增加下面的配置参数:
~~~
'auto_path' => env('app_path') . 'command/',
~~~
配置后, 你可以在命令行测试下刚才新生成的指令。
~~~
php think first
~~~
输出结果为:
~~~
first
~~~
你可以编辑`app\command\First`类,完成实际的指令任务。
>[danger] 注意,如果你生成了指定命名空间的指令,但又不是你配置的自动加载目录,那么仍然需要在`command.php` 文件中定义指令。
>
如果需要生成一个指定的命名空间,可以使用:
~~~
php think make:command app\index\Second second
~~~
';
输出路由定义
最后更新于:2022-04-02 01:55:03
## 输出并生成路由列表(`V5.1.24+`)
假设你的路由定义文件内容为:
~~~
Route::get('think', function () {
return 'hello,ThinkPHP5!';
});
Route::resource('blog', 'Blog');
Route::get('hello/:name', 'index/hello')->ext('html');
~~~
可以使用下面的指令查看定义的路由列表
~~~
php think route:list
~~~
输出结果类似于下面的显示:
~~~
+----------------+-------------+--------+-------------+--------+
| Rule | Route | Method | Name | Domain |
+----------------+-------------+--------+-------------+--------+
| think | | get | | |
| hello/ | index/hello | get | index/hello | |
| blog | Blog/index | get | Blog/index | |
| blog | Blog/save | post | Blog/save | |
| blog/create | Blog/create | get | Blog/create | |
| blog//edit | Blog/edit | get | Blog/edit | |
| blog/ | Blog/read | get | Blog/read | |
| blog/ | Blog/update | put | Blog/update | |
| blog/ | Blog/delete | delete | Blog/delete | |
+----------------+-------------+--------+-------------+--------+
~~~
并且同时会在runtime目录下面生成一个`route_list.php`的文件,内容和上面的输出结果一致,方便你随时查看。
> 如果你的路由定义发生改变的话, 则需要重新调用该指令,会自动更新上面生成的缓存文件。
>
## 输出样式
支持定义不同的样式输出,例如:
~~~
php think route:list box
~~~
输出结果变为:
~~~
┌────────────────┬─────────────┬────────┬─────────────┬────────┐
│ Rule │ Route │ Method │ Name │ Domain │
├────────────────┼─────────────┼────────┼─────────────┼────────┤
│ think │ │ get │ │ │
│ hello/ │ index/hello │ get │ index/hello │ │
│ blog │ Blog/index │ get │ Blog/index │ │
│ blog │ Blog/save │ post │ Blog/save │ │
│ blog/create │ Blog/create │ get │ Blog/create │ │
│ blog//edit │ Blog/edit │ get │ Blog/edit │ │
│ blog/ │ Blog/read │ get │ Blog/read │ │
│ blog/ │ Blog/update │ put │ Blog/update │ │
│ blog/ │ Blog/delete │ delete │ Blog/delete │ │
└────────────────┴─────────────┴────────┴─────────────┴────────┘
~~~
~~~
php think route:list box-double
~~~
输出结果变为:
~~~
╔════════════════╤═════════════╤════════╤═════════════╤════════╗
║ Rule │ Route │ Method │ Name │ Domain ║
╠────────────────╪─────────────╪────────╪─────────────╪────────╣
║ think │ │ get │ │ ║
║ hello/ │ index/hello │ get │ index/hello │ ║
║ blog │ Blog/index │ get │ Blog/index │ ║
║ blog │ Blog/save │ post │ Blog/save │ ║
║ blog/create │ Blog/create │ get │ Blog/create │ ║
║ blog//edit │ Blog/edit │ get │ Blog/edit │ ║
║ blog/ │ Blog/read │ get │ Blog/read │ ║
║ blog/ │ Blog/update │ put │ Blog/update │ ║
║ blog/ │ Blog/delete │ delete │ Blog/delete │ ║
╚════════════════╧═════════════╧════════╧═════════════╧════════╝
~~~
~~~
php think route:list markdown
~~~
输出结果变为:
~~~
| Rule | Route | Method | Name | Domain |
|----------------|-------------|--------|-------------|--------|
| think | | get | | |
| hello/ | index/hello | get | index/hello | |
| blog | Blog/index | get | Blog/index | |
| blog | Blog/save | post | Blog/save | |
| blog/create | Blog/create | get | Blog/create | |
| blog//edit | Blog/edit | get | Blog/edit | |
| blog/ | Blog/read | get | Blog/read | |
| blog/ | Blog/update | put | Blog/update | |
| blog/ | Blog/delete | delete | Blog/delete | |
~~~
## 排序支持
如果你希望生成的路由列表按照路由规则排序,可以使用
~~~
php think route:list -s rule
~~~
输出结果变成:
~~~
+----------------+-------------+--------+-------------+--------+
| Rule | Route | Method | Name | Domain |
+----------------+-------------+--------+-------------+--------+
| blog | Blog/index | get | Blog/index | |
| blog | Blog/save | post | Blog/save | |
| blog/ | Blog/read | get | Blog/read | |
| blog/ | Blog/update | put | Blog/update | |
| blog/ | Blog/delete | delete | Blog/delete | |
| blog//edit | Blog/edit | get | Blog/edit | |
| blog/create | Blog/create | get | Blog/create | |
| hello/ | index/hello | get | index/hello | |
| think | | get | | |
+----------------+-------------+--------+-------------+--------+
~~~
同样的,你还可以按照请求类型排序
~~~
php think route:list -s method
~~~
输出结果变为:
~~~
+----------------+-------------+--------+-------------+--------+
| Rule | Route | Method | Name | Domain |
+----------------+-------------+--------+-------------+--------+
| blog/ | Blog/delete | delete | Blog/delete | |
| think | | get | | |
| hello/ | index/hello | get | index/hello | |
| blog | Blog/index | get | Blog/index | |
| blog/create | Blog/create | get | Blog/create | |
| blog//edit | Blog/edit | get | Blog/edit | |
| blog/ | Blog/read | get | Blog/read | |
| blog | Blog/save | post | Blog/save | |
| blog/ | Blog/update | put | Blog/update | |
+----------------+-------------+--------+-------------+--------+
~~~
> 支持排序的字段名包括:`rule`、`route`、`name`、`method`和`domain`(全部小写)。
## 输出详细信息
如果你希望看到更多的路由参数和变量规则,可以使用
~~~
php think route:list -m
~~~
输出结果变为:
~~~
+----------------+-------------+--------+-------------+--------+-------------------------+---------+
| Rule | Route | Method | Name | Domain | Option | Pattern |
+----------------+-------------+--------+-------------+--------+-------------------------+---------+
| think | | get | | | [] | [] |
| hello/ | index/hello | get | index/hello | | {"ext":"html"} | [] |
| blog | Blog/index | get | Blog/index | | {"complete_match":true} | [] |
| blog | Blog/save | post | Blog/save | | {"complete_match":true} | [] |
| blog/create | Blog/create | get | Blog/create | | [] | [] |
| blog//edit | Blog/edit | get | Blog/edit | | [] | [] |
| blog/ | Blog/read | get | Blog/read | | [] | [] |
| blog/ | Blog/update | put | Blog/update | | [] | [] |
| blog/ | Blog/delete | delete | Blog/delete | | [] | [] |
+----------------+-------------+--------+-------------+--------+-------------------------+---------+
~~~
';
生成路由映射缓存
最后更新于:2022-04-02 01:55:01
## 生成路由映射缓存`optimize:route`
>[danger] 路由映射缓存用于开启路由延迟解析的情况下,支持路由反解的URL生成,如果你没有开启路由延迟解析或者没有使用URL路由反解生成则不需要生成。
生成路由映射缓存的命令:
~~~cmd
php think optimize:route
~~~
执行后,会在`runtime`目录下面生成`route.php`文件。
';
生成数据表字段缓存
最后更新于:2022-04-02 01:54:58
## 生成数据表字段缓存`optimize:schema`
>[danger] 字段缓存仅在部署模式下生效
可以通过生成数据表字段信息缓存,提升数据库查询的性能,避免多余的查询。命令如下:
~~~cmd
php think optimize:schema
~~~
会自动生成当前数据库配置文件中定义的数据表字段缓存,也可以指定数据库生成字段缓存(必须有用户权限),例如,下面指定生成`demo`数据库下面的所有数据表的字段缓存信息。
~~~cmd
php think optimize:schema --db demo
~~~
执行后会自动在`runtime/schema`目录下面按照数据表生成字段缓存文件。
如果你的应用使用了不同的数据库连接,可以根据模块来生成,如下:
~~~cmd
php think optimize:schema --module index
~~~
会读取index模块的模型来生成数据表字段缓存。
>[danger] 没有继承think\Model类的(抽象)模型类不会生成。
更新数据表字段缓存也是同样的方式,每次执行都会重新生成缓存。如果需要单独更新某个数据表的缓存,可以使用:
~~~cmd
php think optimize:schema --table think_user
~~~
支持指定数据库名称
~~~cmd
php think optimize:schema --table demo.think_user
~~~
';