更新日志
最后更新于:2022-04-02 07:54:48
# 版本更新日志
[TOC=2,2]
## `V6.0.12LTS`(2022年1月21日)
本版本主要完善了命令行对`PHP8.1`的支持,并增加了路由的闭包检测机制。
### 主要更新
* 改进缓存驱动`unserialize`方法参数类型限制
* 优化代码使IDE友好
* 修正命令行对`PHP8.1`的兼容性
* 路由增加闭包检测有效性
### `ThinkORM`主要更新包括:
* 完善sqlite驱动
* 修正Fetch类
* 改进多对多关联
* 添加数据写入对对象值的判断处理
* 改进一对一关联写入
* 一对一关联查询绑定属性调整
* 改进远程一对多关联查询
* 优化模型数据处理
## `V6.0.11LTS`(2022年1月日5)
* 修正ENV读取问题
## `V6.0.10LTS`(2021年12月31日)
本版本主要添加了`PHP8.1`的兼容支持,以及`ThinkORM`的大量改进。
### 主要更新:
* 兼容PHP8.1
* 改进cookie跨域删除
* 改进多语言自动加载
* 改进url生成
* Filesystem 增加url方法 获取文件访问地址
* 文件上传错误支持多语言
* 修正 make:controller 指令错误
* 发送cookie前先检查请求头是否已发送
* 改进多文件上传的文件hashName冲突问题
* 调整thinkPath路径赋值为真实绝对路径 以避免特殊环境潜在隐患
* 支持 psr7 response
* 控制器中间件支持动态参数
* 改进env文件解析
### `ThinkORM`主要更新包括:
* 修正column方法
* Db和模型增加filter数据处理机制
* 调整json处理
* 修正sqlite驱动lock
* 获取数据库字段类型不区分大小写
* 修正json方法
* 修正多对多关联中间表数据
* 修正多对多模型
* 改进db类hidden visible append 方法处理机制
* 改进关联的软删除查询
* 完善获取sql时的字符转义
## `V6.0.9`(2021年07月22日)
本版本主要添加了事件监听的通配符支持,并修正了框架的一处可能的序列化漏洞,同时对模型做了一些改进和优化。
* 更新`league/flysystem`版本
* 事件监听支持通配符
* 支持时间字段的统一配置
* 改进`Request`类`all`方法
>[danger] 由于`league/flysystem`低版本存在漏洞,官方进行了安全升级,该修正使得框架的PHP版本依赖也提升到`7.2+`。
`ThinkORM`主要更新如下:
* 强化虚拟模型支持
* 改进模型事件和数据库事件
* 改进动态获取器处理
* 优化分页查询
* 改进聚合查询
* 关联增加`withoutField`方法
* 软删除`destroy`方法优化
## `V6.0.8`(2021年04月26日)
本版本主要添加了多环境变量配置文件支持
* 增加`LogRecord`事件
* 消除`Validate`类某处类型声明警告
* 路由分组增加`dispatcher`方法,支持设置分组的调度
* `Request`类增加`all`方法支持获取包括`File`在内的所有参数
* 改进环境变量定义支持多`env`文件读取
## `V6.0.7`(2021年01月25日)
本版本主要针对上个版本做了一些路由修正,还意外收获了一些性能提升,是一个建议更新的版本。
* 修正`Validate`类的PHP8兼容性
* 改进`redis`驱动的`append`方法
* 修正路由匹配检测问题
* 优化路由变量正则规则生成
* 改进`responseView`的内容渲染
## `V6.0.6`(2021年01月11日)
本版本更新为兼容PHP8.0版本,并做了一些的改进和优化。
* 兼容`composer2 `生成配置文件
* 优化`optimize:schema`指令
* 增加`socket-log` 的 curl 超时设置
* 修正路由匹配
* 增加兼容`PHP8`处理
* 增加汉字识别匹配范围 支持部分生僻字正则
* 改进响应文件请求时的缓冲清除
* 资源路由支持设置变量规则
* `$request->ip()` 方法兼容PHP8
* 修复验证器`in`、`between`方法,使用数组,功能异常
* 修正含有`__make`的类实例化后未执行`invokeAfter`的问题
* 修复命令行创建中间件命名空间无效 bug
## `V6.0.5`(2020年10月27日)
本次更新为兼容Composer2.0做的特别更新版本,主要包含:
* 修正验证类append方法
* 改进缓存标签机制
* 改进闭包路由内使用request对象
* 改进文件缓存驱动
## `V6.0.4`(2020年9月28日)
本次更新为常规更新,主要包含:
### 新增
* [新增] 多语言支持解析`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`(2020年6月25日)
本次更新包含一个调试模式的系统信息安全隐患修正,建议更新。
### 主要更新:
* 异常提取`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`(2020年1月13日)
本次更新包含一个可能的`Session`安全隐患修正,建议更新。
### 主要更新:
* 改进设置方法后缀后的操作名获取问题
* 修正`optimize:schema`指令
* 修正`Request`类`inputData`处理
* 改进中间件方法支持传多个参数
* 修正`sessionid`检查的一处隐患
* 完善对15位身份证号码的校验
* 增加远程多对多关联支持
* 增加`MongoDb`的事务支持(`mongodb`版本V4.0+)
* 改进`insertAll`的`replace`支持
## `V6.0.1`(2019年12月24日)
### 主要更新:
* 完善`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`方法的查询
## `V6.0.0`(2019年10月24日)
### 主要更新日志
* mobile 验证简化
* 控制器中间件支持传参
* 增强中间件CheckRequestCache的实用性
* 改进容器invokeClass方法异常处理
* 控制器中间件过滤条件支持字符串
* 改进Route类getDomainBind方法
* 防止路由标识生成URL时生成空字符串
* 让中间件CheckRequestCache只访问一次临界区
* 完善命中判断
* 修正Request::port返回类型
* 增强高并发下session_id生成的唯一性
* 取消路由缓存功能及相关指令
* 修正 Request::remotePort 返回类型
* 完善跨域中间件的响应头部
* 改进容器异常处理
* 改进生成文件模板
* 移除build指令纳入扩展
* 改进Response增加cookie方法用于设置Cookie
* 修正生成URL不传参数时,方法名为空
* 修复中间件CheckRequestCache使用过期数据
* 修复memcache驱动inc函数重复添加前缀问题
* 删除Resonse类setCookie方法
* 使用session_create_id生成id,保证唯一性
* 修复中间件FormTokenCheck无法启用问题
* 修正halt助手函数
## RC5(2019年10月13日)
`RC5`版本主要改进包括多应用模式独立,以及中间件机制调整。
### 主要新特性
* 多应用模式独立为扩展
* 中间件分组执行
* 增加路由配置文件的全局中间件定义
* 中间件支持优先级定义
* 中间件支持请求结束回调
* 中间件执行去重
* 模板根目录免配置自动识别
* 改进智能事件订阅
* 页面Trace独立为扩展
### 更新日志
* 修正request类isJson方法
* 提升swoole下多应用的性能
* 修正Cookie保存
* 改进字段缓存指令
* 修正路由正则生成
* 改进模板变量的全局赋值
* 改进filesystem
* 改进View 增加单元测试
* 修正php模板驱动
* 取消view_base配置,增加view_dir_name配置
* 完善Session及其单元测试
* 改进session助手函数支持获取所有数据
* 完善中间件及其单元测试
* 改进事件智能订阅
* 验证错误信息支持数组
* 改进多语言自动侦测
* 改进自动多语言
* 改进事件观察者支持事件前缀
* 去除Cache返回类型限制
* 多应用配置读取优先级调整
* 多应用路由改进
* 改进批量验证的错误信息返回
* 页面Trace中间件移除 改为扩展
* 改进session初始化中间件
* 修正默认URL访问
* 修正url生成对域名绑定的支持
* 改进中间件机制 全局、路由和控制器中间件分开
### 调整
* 获取当前应用名改为`app('http')->getName()`
## RC4(2019年8月16日)
`RC4`版本主要改进包括`ORM`库独立,日志系统增加多通道支持,缓存、日志、数据库的配置文件统一调整为多通道模式,并作了大量的改进和修正。
### 主要新特性
* 数据库和模型改为独立的`think-orm`库
* 模型关联功能增强
* 日志支持多通道、并统一命令行和WEB日志格式
* 增加`Filesystem`组件
* 增加容器对象实例化回调机制
* 路由注解独立为`think-annotation`库
* 多应用模式下路由定义支持纳入应用目录
### 功能改进
* 改进路由类的配置读取
* 改进`parseLike`查询
* 改进`ViewResponse`类增加内容渲染输出支持
* 增加`display`助手函数
* 验证类`maker`方法支持注入扩展验证规则
* 改进事件触发的对象传入
* 改进`Console/Table`类
* 改进关联定义对查询构造器的支持
* 关联类增加`withField`和`withLimit`方法,并取消`Query`类`withField`方法
* 增加延迟关联查询对`withLimit`的支持
* 改进模型`toArray`方法
* 改进Url生成的域名参数
* 改进 `make:command`指令生成
* 缓存有效期支持`DateInterval
`
* 改进Query类find方法
* 改进`json`查询
* 改进查询缓存
* 增加`filesystem`组件
* 改进跨域请求
* 改进路由检测缓存配置
* 改进注解路由的文件写入
* 路由注册支持注册`options`请求类型
* 改进重定向路由检测
* 改进模型的`hasWhere`方法对闭包查询条件的支持完善
* 增加`time_query_rule`数据库配置参数 用于自定义时间查询规则
* 改进时间字段类型的自动识别
* 改进`redis`驱动
* 容器对象增加`invoke`回调机制
* 改进多对多关联
* 资源路由增加`withModel`和`withValidate `对各个路由设置不同的模型绑定和验证
* 改进`getLastInsID`方法
* 日志类调整 支持多通道写入
* 改进模型输出
* 支持单独关闭某个通道的日志写入
* 取消部署模式下 不写入调试日志的功能 用调试级别设置单独的日志渠道来替代
* 改进日志记录格式
* 支持日志输出格式化
* 改进资源路由
* 改进命令行日志实时写入
* 日志通道支持单独设置level配置参数
* Log类调整优化
* 增加`paginateX`查询用于大数据分页查询
* 数据集增加`first`和`last`方法
* 改进`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类的`init`和`connect`方法取消 并入`store`方法
* `cache`助手函数调整
* `cache`助手函数取消初始化用法
* `cache`助手函数留空返回Cache对象
* 调整调试模式检测位置
* 默认时间字段类型改为`timestamp
`
* 取消Model类`getConnection`和`setConnection`方法
* 注解路由移出核心,注解相关功能使用`topthink/think-annotation
`
* 改进路由 取消`url_convert`配置参数
* 取消`route:build`指令
* 调整默认模板目录为根目录`view
`
* 取消默认的请求日志记录 在项目里面自己添加
* 统一`find`查询必须使用查询条件
* 扩展的service配置文件默认放到vendor目录下
* 废除`LogLevel`事件
* 取消App类的序列化方法
* 控制台的`user`配置改为通过静态方法设置当前执行用户
## RC3(2019年6月3日)
RC3版本主要改进和优化了系统内置中间件,改进了一些用法和体验,并且把不常用的驱动移出核心改为扩展方式提供。
### 主要新特性
* 增加`whereWeek`日期查询
* 自增ID获取支持类型自动转换
* 当前请求记录匹配路由规则
* 增加`requireWithout`验证规则
* 优化路由ext和name方法以及URL生成
* 增加项目自定义类
* URL生成使用对象方式操作
* 修改器改进
* `dump`/`halt`助手函数调整支持输出多个变量
* 关联自动更新
* 模型数据集增加`delete`和`update`方法
* 模型支持表后缀以及动态切换
* 注解路由支持给某个路由指定所属分组
* 多语言支持分组定义
* 支持自定义加载语言文件
* 多语言定义支持YML格式
* 缓存标签改进
* 缓存类增加`push`方法
* Cookie保存时间支持DateTimeInterface
* 增加表单令牌中间件
* 控制器支持__call方法
* 增加`deny_app_list`配置参数
* 控制器中间件only和except定义不区分大小写
* `app_map`支持指定泛应用映射
### 问题修正
* 修正参数绑定的浮点型精度问题
* 修正软删除
* 修正模型的数据库连接
* 修正`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`指令
* 修正`Collection`类`load`方法
* 修正`redis`驱动的端口类型
* 修正`session`数据序列化使用JSON处理的问题
* 修正分组路由合并解析
* 修正模型的`hidden`方法隐藏关联模型的问题
* 修正关联查询关联键为空的错误
* 修正返回204状态码的响应判断
* 修正`Request`类`has`方法对`env`和`session`的支持
* 修正`provider.php`文件无效问题
* 修正关联查询的部分问题
* 修正validate助手函数支持指定验证器类
* 修正验证类`getValidateType`方法
* 修正入口单独开启调试模式
* 修正加载Composer应用
### 用法调整
* 页面trace中间件仅在调试模式有效
* `Socket`日志驱动移出核心
* `PostgreSQL`、`Sqlite`和`SqlServer`驱动移出核心
,改为扩展
* 取消内置`think\Controller`基类
* `Yaconf`支持移出核心 纳入扩展`think-yaconf`
* 字段排除改为`withoutField`方法
* 取消`useGlobalScope`方法增加`withoutGlobalScope`方法
* 更改默认生成的中间件位置
* 加载默认语言包无需开启多语言中间件
* `Cookie`类恢复`get`和`has`方法支持
* `token`助手函数调整
* 全局请求缓存参数调整
* 统一中间件调用传参,不支持`:`分割传参
* 缓存数据统一进行序列化后存储
* Cache类rm方法更改为delete方法
* validate助手函数返回Validate对象实例,参数改变
### 废弃用法
* 取消多语言的`auto_detect`配置
* 取消`session`类的`auto_start`配置参数和`boot`方法
* 废弃`Where`数组对象查询
* 取消模型事件观察者
* 取消`JumpResponse`及`success`/`error`/`result`等方法和助手函数
* 取消表达式查询解析扩展及`think\db\Expression`类
* 废弃模型自动完成功能,使用模型事件替代
* 取消`cookie`的`prefix`参数
* 取消一系列不推荐使用的助手函数
* 取消`optimize:facade` `optimize:model`指令 改为扩展方式
* 取消命令行执行URL
* 删除`Config`类`__get` 和 `__isset` 方法
## RC2(2019年4月22日)
相比较`RC1`版本更新调整较大,主要更新如下:
* 底层架构针对协程做优化调整
* 增加WEB应用管理类`Http`
* 增加应用初始化服务和服务注册机制
* 查询事件和模型事件使用事件系统接管
* `Session`类重构,不再使用PHP内置会话
* `Cookie`类仅支持设置和写入,不再支持读取
* 取消`Config`类的动态设置功能
* 部分核心功能中间件化(页面Trace、多语言、请求缓存和Session初始化)
* 取消惯例配置文件
* 增加驱动接口规范驱动开发
* 改进Db类和查询类
* 精简一些不必要的类库
* 改进路由注册
* 由于异常的需要`View`类改为内置,但默认仅支持原生PHP模板
* 大量细节改进和修正
## RC1(2019年2月14日)
* 改进Url类`build`方法
* 修复获取当前页码数据类型
* 修正`parseKey`方法传入数值的情况
* 改进`optimize:config`指令对`declare`申明的支持
* 取消URL参数模式配置
* 增加`optimize:facade`指令用于生成`facade`类的方法注释
* 取消`Query`类的`extend`方法
* 原来的`Expression`类更改为`Raw`类
* 增加新的`Expression`类用于表达式查询扩展
* `Collection`类增加`whereLike`/`whereNotLike`/`whereIn`/`whereNotIn`/`whereBetween`/`whereNotBetween`等快捷方法
* Query类的`raw`方法移动到Db类
* 取消`Request`类的`hook`方法
* 修正`Route::view`方法
* 优化模型获取器方法
* 多对多关联的`pivotDataName`方法更名为`name`方法
* Query类增加`partition`/`duplicate`/`extra`方法
* 改进mysql驱动支持分区和`duplicate`以及额外参数
* mysql驱动的`insert`方法改用更清晰的`insert set`语法
* 修正`Event`类`bind`属性定义
* 修正验证类的`append`一处bug
* 改进`Query`类`update`方法支持读取模型的更新条件
* 取消模型类的`getUpdateWhere`方法统一使用`getWhere`方法
* 改进query类的`fetchArray`方法处理
* 改进路由类取消`app`属性
* 增加`think\facade\RuleName`类
* 增加`whereFieldRaw`查询方法
* 改进自动多应用名称获取
* App类增加`withEvent`方法支持关闭事件机制
* 改进`Dispatch`类对`var_dump`的支持
* 改进`hasMany`的`withCount`自关联
* 修正纯数字检测参数类型转换问题
* 修正`raw`助手函数
* `mysql`支持`find_in_set`查询
* 改进`url`方法对自动多应用的支持
';
升级指导
最后更新于:2022-04-02 07:54:46
`V6.0`版本保持兼容升级,但不兼容`5.*`版本的升级。
# `5.1`升级到`6.0`版本
>[danger] 不建议老的项目升级到新版,除非你有重构计划,否则就算升级了也只是表面上升级了。
> 本文主要用于指导开发者从`5.1`升级到`6.0`最新(RC)版本,由于`6.0`不支持`5.1`的无缝升级,下面的升级步骤和指导仅供学习参考,或有遗漏及考虑不周之处,因此不保证你的所有功能都能正常升级。
`6.0`版本必须使用`composer`安装,所以你需要首先安装新的`6.0`版本,然后把原来`5.1`的文件复制进去,完成升级工作。
~~~cmd
composer create-project topthink/think:6.0.0 tp
~~~
安装完成后,把原来`application`目录下面的文件复制到`app`目录下面,然后把`config`和`route`目录下的文件复制到同名目录下。接下来,按照下面的步骤来升级操作。
从`5.1`多模块迁移到`6.0`的多应用后,应用类库的命名空间原则上可以无需调整,但不再支持跨应用调用(包括路由及模板,每个应用的路由是独立的),这点务必引起重视。如果你的应用根命名空间不是默认的`app`需要改成`app`。
[TOC=2,2]
## 第一步:应用配置
如果原来你使用了多模块开发模式,直接改成新版的多应用模式是最简单的,需要额外安装多应用模式扩展。
```
composer require topthink/think-multi-app
```
如果你自定义了访问控制器的名称,需要修改`route.php`配置文件中的`controller_layer`值。
```
// 访问控制器层名称
'controller_layer' => 'controller',
```
如果你开启了控制器类的后缀,需要设置`route.php`配置文件中的`controller_suffix`值。
```
// 开启控制器后缀
'controller_suffix' => true,
```
如果自定义了空控制器的名称,则需要设置`route.php`配置文件中的`empty_controller`值。
```
// 空控制器名
'empty_controller' => 'Error',
```
## 第二步:配置调整
请按照如下顺序检查及调整你的配置文件和相关配置代码。
### 应用的配置文件
如果是多应用的话,应用配置文件应当放入应用下的`config`目录。全局配置文件位置无需调整。
### 配置获取调整
原来获取一级配置参数的方式
```
Config::pull('app');
```
需要改成
```
Config::get('app');
```
所有的配置读取必须从第一级配置开始,例如,原来的
```
Config::get('exception_handle');
```
必须改成
```
Config::get('app.exception_handle');
```
### 废弃动态设置
动态更改配置参数的用法已经废弃,下面的用法不再支持。
```
Config::set('route.default_return_type', 'json');
```
如果你需要把数据库的配置参数读入配置,可以使用
```
$config = Db::name('config')->column('value', 'name');
Config::set($config, 'route');
```
### `Config`类不再支持数组方式读取
`Config`类不再使用`ArrayAccess`接口,因此不再支持数组方式读取。
### 路由和URL配置独立
路由和URL请求相关的配置参数独立为`route.php`配置文件,而不再使用`app.php`配置文件。
## 第三步:路由和请求调整
### 路由定义文件位置调整
单应用模式下,路由定义文件和之前一样就在`route`目录下面,如果你的项目是采用了多应用模式的话,每个应用的路由定义和匹配都是独立的,也没有模块的概念,路由定义文件的位置应该是在`应用/route`下面,例如:
~~~
app/index/route/route.php // index应用的路由定义文件
app/index/route/web.php // index应用的第二个路由定义文件
app/admin/route/route.php // admin应用的路由定义文件
~~~
> 应用的路由规则其实是定义的入口文件(或者应用名)后面的URL部分,而不包含应用。
### 路由注册方法调整
首先如果你的路由定义采用的是返回数组形式,全部改成方法定义。
例如:
~~~
return [
'hello/:name' => 'index/hello',
];
~~~
必须改成:
~~~
Route::get('hello/:name', 'index/hello');
~~~
如果路由定义方法(包括`rule`/`get`/`post`/`put`/`delete`/`patch`/`miss`/`group`等方法)使用了`option`和`pattern`参数,全部改成方法调用形式,例如原来的:
~~~
Route::get('hello/:name', 'index/hello', [ 'ext' => 'html'], [ 'name' => '\w+']);
~~~
需要改成
~~~
Route::get('hello/:name', 'index/hello')
->ext('html')
->pattern([ 'name' => '\w+']);
~~~
### 路由分组调整
如果路由分组定义使用了数组,改成闭包方式定义,例如:
~~~
Route::group('blog', [
':id' => 'Blog/read',
':name' => 'Blog/read',
])->ext('html')->pattern(['id' => '\d+']);
~~~
必须改成
~~~
Route::group('blog', function() {
Route::get(':id', 'Blog/read');
Route::get(':name', 'Blog/read');
})->ext('html')->pattern(['id' => '\d+']);
~~~
如果你需要注册一个虚拟的路由分组,可以直接在第一个参数使用闭包
~~~
Route::group(function() {
Route::get('blog/:id', 'Blog/read');
Route::get('user/:name', 'User/read');
})->ext('html')->pattern(['id' => '\d+']);
~~~
### 取消了`url_controller_layer`配置
改为在`route.php`配置文件中使用`controller_layer`设置。
### 取消`controller_suffix`配置
改为在`route.php`配置文件中使用`controller_suffix`设置。
同时`class_suffix`配置参数已经无效。
### 取消`mergeExtraVars`方法和对应参数
改为在路由规则中明确指定变量规则。
### `allowCrossDomain`方法参数调整
取消原来的第一个参数。
### `header`方法取消
需要单独改变Header信息的直接通过中间件统一处理。
### 取消`Request`类的`hook`方法
该方法已经在最新版本中取消。如果你使用了该功能,在自定义请求对象`app\Request`中直接增加相应的方法即可。并确保`provider.php`文件中添加如下绑定:
```
'think\Request' => \app\Request::class,
```
### 取消`URL`参数模式配置
原来的URL参数模式配置参数`url_param_type`,统一使用参数/值的方式。如果你设置了该配置参数为1,必须改成定义路由的方式。
### 取消别名路由
因为使用场景有限和性能开销问题,取消原来的别名路由功能,建议使用资源路由或者单独的路由替代。
### 取消快捷路由
因为使用场景有限和不太符合规范,取消了原来的控制器快捷路由功能。
### 取消空操作功能
建议使用分组MISS路由功能或者控制器的`__call`方法替代。
## 第四步:控制器和视图调整
### `think\Controller`类取消
系统不再提供基础控制器类`think\Controller`,原来的`success`、`error`、`redirect`和`result`方法需要自己在基础控制器类里面实现。
系统默认在应用目录下面提供了一个`app\BaseController`基础类,或者你可以直接放入你的应用里面,继承使用。
你可以安装下面的扩展用于支持旧版本的跳转操作
~~~
composer require liliuwei/thinkphp-jump
~~~
### 视图和模板引擎从核心分离
模板引擎类不再内置到核心框架,但使用
~~~
composer create-project topthink/think
~~~
会默认安装该组件(如果不需要使用的话可以自己卸载`topthink/think-view`)。
安装后,由于内置的`think\Controller`类已经取消,如果你的控制器类需要调用`fetch`/`display`/`assign`等视图方法,必须改为调用`think\facade\View`类,如果是使用`view`助手函数方式的话,可以无需调整。
```
View::assign('name', $name);
View::fetch();
```
### `share`方法取消
原来视图类的`share`方法取消,可以使用
```
think\facade\View::assign($vars);
```
## 第五步:数据库和模型调整
### `Db`改为使用门面对象
新版的`Db`类不再是静态类,需要使用`think\facade\Db`门面进行静态代理。
~~~
\think\facade\Db::name('user')->find();
~~~
### 数据库配置信息调整
数据库配置文件或者`connect`方法取消`DSN`数据库配置定义方式,全部采用数组方式配置定义。
~~~
Db::connect('mysql://root:1234@127.0.0.1:3306/thinkphp#utf8')
->table('user')
->find();
~~~
必须改成
~~~
Db::connect('db_config')
->table('user')
->find();
~~~
并且按照新版的规范在数据库配置文件中增加`db_config`连接信息。
### 取消`fetchPdo`方法
取消了`Query`类的`fetchPdo`方法,需要的时候直接使用`getPdo`方法替代。
### 取消查询方法传入`Query`对象
取消Query类的CURD查询方法传入当前对象,如果需要请使用闭包替代。
### `insert`/`insertGetId`/`insertAll`方法取消`replace`参数
`insert`/`insertGetId`/`insertAll`方法的第二个`replace`参数已经取消,改为使用`replace`方法。
~~~
$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::name('user')->insert($data, true);
~~~
需要改为
~~~
$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::name('user')->replace()->insert($data);
~~~
### 取消`db`和`model`助手函数
这两个助手函数`5.1`版本已经不再建议使用了,`6.0`版本已经废弃掉这两个助手函数,请直接使用`\think\facade\Db`类静态方法和实际的模型类调用。
### 取消`setInc`/`setDec`方法
取消Query类的`setInc`/`setDec`方法,统一使用`inc`/`dec`方法替代。例如:
~~~
Db::name('user')->where('id', 1)
->inc('exp')
->dec('score')
->update();
~~~
### 取消`join`方法的批量操作
`join`方法不再支持批量操作多个表,如果你使用了`join`方法批量操作,需要改成每个表单独调用一次`join`方法。
### 取消`setField`方法
取消Query类的`setField`方法,请直接使用`data`方法或者`update`方法。
### 取消`__TABLE_NAME__`支持
`table`方法取消`__TABLE_NAME__`支持,必须明确调用完整表名或者使用`name`方法。
### 取消`whereOr`等方法传入`Query`对象
因为`Query`对象查询只能使用一次,除了`where`方法本身可以传入`Query`对象外,其它的所有`where`查询方法(例如`whereOr`/`whereExp`等)都不再支持传入`Query`对象。
### 取消`resultset_type`配置参数
数据集查询结果不再受`resultset_type`配置参数影响,默认情况下,Db查询统一返回数组,模型查询统一返回模型对象和模型数据集对象。如果Db查询的时候也需要返回数据集的话,可以显式调用`fetchCollection`方法。
### 取消`Query`类的`extend`方法
取消了`Query`类的`extend`方法,如果需要扩展查询方法,建议自定义`Query`类并继承系统的`think\db\Query`类即可,然后在模型中定义`query`属性或者配置数据库连接的`query`参数为你的自定义类。
### `Expression`对象调整
原来的`Expression`对象已经更改为更适合的`Raw`对象,但不影响`Db::raw()`方法的调用。
### 取消查询`eq/neq/gt/lt/egt/elt`表达式
由于存在两种用法,并且不够直观,全部统一为更直观的用法。
下面的用法不再支持
~~~
Db::name('user')->where('id', 'egt', 1)
->where('status', 'neq' ,1)
->select();
~~~
统一使用
~~~
Db::name('user')->where('id', '>=', 1)
->where('status', '<>' ,1)
->select();
~~~
### 取消分表功能
出于分表的性能问题和复杂性,不再提供分表方法,建议使用数据库的分区功能替代。新版可以使用`partition`方法指定当前查询的分区。
### 数据库的查询统计合并
数据库的查询次数合并到`queryTimes`,不再区分读写操作,你可以使用下面的方法获取当前请求的数据库查询次数(包括读写)
~~~
Db::getQueryTimes();
~~~
### 模型后缀
如果之前开启了类库后缀功能的话,你必须在模型类里面明确指定`name`属性。
### 取消了模型的`get`/`all`方法
无论使用`Db`类还是模型类查询,全部统一使用`find`/`select`方法,取消了之前模型类额外提供的`get`/`all`方法。同时取消的方法还包括`getOrFail`/`allOrFail`。
### 取消全局查询范围`base`方法
取消模型类的全局查询范围`base`方法,改由使用`globalScope`属性定义(数组)需要全局查询的查询范围方法。
### 模型事件调整
模型事件不再需要使用`event`方法注册事件,统一在模型类中定义事件方法,例如
~~~
extra = 'extra';
}
public function onBeforeWrite($user)
{
$user->extra = 'extra';
}
}
~~~
并且模型增加`after_read`事件,在查询后创建模型对象实例的时候触发。
### 取消模型自动完成
模型的自动完成功能已经取消,请使用模型事件代替。
### 模型`save`方法调整
模型类的`save`方法不再支持`where`参数。
### 关联统计调整
如果你的关联统计使用了闭包方式返回关联统计字段,需要调整为如下方式:
```
User::withCount(['cards' => function($query,&$name) {
$query->where('status', 1);
$name = 'card_count';
}])->select();
```
### 模型和数据集的输出调整
取消`hidden`/`visible`/`append`方法的第二个参数,当你调用这几个方法的时候,无论模型是否设置了相关属性,都会直接覆盖之前设置的值。
### 查询缓存调整
如果希望在更新和删除之后自动清除之前的查询缓存,必须在`cache`方法中传入key值而不是`true`。
### 删除关联类`selfRelation`方法
如果你在定义关联的时候使用了`selfRelation`方法,请直接删除该方法,目前已经不再需要,会自动识别是否为自关联。
### 删除关联类的`setEagerlyType`方法
一对一关联无需在定义关联的时候指定为`JOIN`查询,在查询的时候直接使用`withJoin`方法即可使用`JOIN`方式进行关联查询。
### 多对多关联
多对多关联的`pivotDataName`方法更名为更简单的`name`方法。
## 第六步:行为调整
行为和`Hook`已经用新版的事件机制替代,需要把你的行为改成事件响应或者中间件(部分请求拦截的行为可以直接改为中间件)。
原来的系统内置钩子的行为类
~~~
[
'AppInit' => ['\app\index\listener\Hello'],
// 更多事件监听
],
];
~~~
修改完成后,你可以删除应用目录下不再使用的`tags.php`文件。
内置事件和钩子的对应关系如下:
| 事件| 对应`5.1`钩子| 参数 |
| --- | --- | --- |
| `AppInit` | `app_init `| 无 |
| `AppEnd` | `app_end `| 当前响应对象实例 |
| `LogWrite` | `log_write `| 当前写入的日志信息 |
| `LogLevel` | `log_level `| 包含日志类型和日志信息的数组 |
>[danger] 原来的`app_begin`、`response_send`、`response_end`、`action_begin`、`module_init`和`view_filter`钩子已经废弃。
## 第七步:其它调整及注意事项
### 系统`Facade`类库别名取消
系统`Facade`类库的别名已经取消,因此不能再使用
```
use Route;
Route::rule('hello/:name', 'index/hello');
```
必须使用
```
use think\facade\Route;
Route::rule('hello/:name', 'index/hello');
```
### `Session`调整
`Session`新版默认不开启,必须为在全局中间件定义文件中添加
~~~
'think\middleware\SessionInit'
~~~
原来的`Session::get()` 可以获取全部的Session数据必须改成 `Session::all()`
### 严格类型检查
由于新版框架核心类库全面启用强类型参数,并且使用严格模式,所以在调用系统方法的时候一定要注意参数的类型,或者注意看抛出的异常信息进行修正。
>[success] 最后,希望你的`6.0`升级之旅顺利^_^ ,希望大家在升级和使用`6.0`的过程中,多反馈和建议,帮助我们尽快完善和发布正式版本。
';
助手函数
最后更新于:2022-04-02 07:54:43
## 助手函数
系统为一些常用的操作方法封装了助手函数,便于使用,包含如下:
| 助手函数 | 描述 |
| --- | --- |
| abort | 中断执行并发送HTTP状态码 |
| app | 快速获取容器中的实例 支持依赖注入 |
| bind | 快速绑定对象实例 |
| cache | 缓存管理 |
| class_basename | 获取类名(不包含命名空间) |
| class_uses_recursive | 获取一个类里所有用到的trait |
| config | 获取和设置配置参数 |
| cookie | Cookie管理 |
| download| 获取\think\response\File对象实例 |
| dump | 浏览器友好的变量输出 |
| env | 获取环境变量 |
| event| 触发事件|
| halt | 变量调试输出并中断执行 |
| input | 获取输入数据 支持默认值和过滤 |
| invoke | 调用反射执行callable 支持依赖注入 |
| json | JSON数据输出 |
| jsonp | JSONP数据输出 |
| lang | 获取语言变量值 |
| parse_name | 字符串命名风格转换 |
| redirect | 重定向输出 |
| request | 获取当前Request对象 |
| response | 实例化Response对象 |
| session | Session管理 |
| token | 生成表单令牌输出 |
| trace | 记录日志信息 |
| trait_uses_recursive | 获取一个trait里所有引用到的trait |
| url | Url生成 |
| validate | 实例化验证器 |
| view | 渲染模板输出 |
| display| 渲染内容输出 |
| xml | XML数据输出 |
| app_path| 当前应用目录 |
| base_path| 应用基础目录 |
| config_path| 应用配置目录 |
| public_path| web根目录 |
| root_path| 应用根目录 |
| runtime_path| 应用运行时目录 |
>[danger] 可以在应用的公共函数文件中重写上面这些助手函数。
';
附录
最后更新于:2022-04-02 07:54:41
[助手函数](%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)
';
Swoole
最后更新于:2022-04-02 07:54:39
本篇内容主要讲述了最新的`think-swoole`扩展的使用。目前仅支持Linux环境或者MacOs下运行,要求`swoole`版本为`4.3.1+`。
> 由于 `think-swoole`是基于`swoole`的,要了解这个扩展如何使用,首先需要对`swoole`有一定的了解,这也是本文阅读的前提,具体可以参考 Swoole官方文档内容:[https://wiki.swoole.com](https://wiki.swoole.com)
## 安装
首先按照`Swoole`官网说明安装`swoole`扩展,然后使用
~~~
composer require topthink/think-swoole
~~~
安装`think-swoole`扩展。
>[danger] 由于`Swoole`不支持`windows`环境,所以你无法在`windows`环境下测试,只能使用虚拟机或者`WSL`环境测试。
## `HTTP`服务
直接在命令行下启动HTTP服务端。
~~~
php think swoole
~~~
启动完成后,默认会在`0.0.0.0:80`启动一个HTTP Server,可以直接访问当前的应用。相关配置参数可以在`config/swoole.php`里面配置(具体参考配置文件内容)。
支持的其它操作包括:
启动HTTP服务(默认)
~~~
php think swoole start
~~~
停止服务
~~~
php think swoole stop
~~~
重启服务
~~~
php think swoole restart
~~~
`reload`服务
~~~
php think swoole reload
~~~
### 守护进程模式
如果需要使用守护进程方式运行,可以配置
~~~
'options' => [
'daemonize' => true
]
~~~
## 热更新
由于`Swoole`服务运行过程中PHP文件是常驻内存运行的,这样可以避免重复读取磁盘、重复解释编译PHP,以便达到最高性能。所以更改业务代码后必须手动`reload`或者`restart`才能生效。
`think-swoole`扩展提供了热更新功能,在检测到相关目录的文件有更新后会自动`reload`,从而不需要手动进行`reload`操作,方便开发调试。
如果你的应用开启了调试模式,默认是开启热更新的。原则上,在部署模式下不建议开启文件监控,一方面有性能损耗,另外一方面对文件所做的任何修改都需要确认无误才能进行更新部署。
热更新的默认配置如下:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/52/18/52181406361448d118fe78f5777199e9_932x242.png)
当我们在应用的根目录下定义一个特殊的`.env`环境变量文件,里面设置了`APP_DEBUG = true`会默认开启热更新,你也可以直接把`enable`设置为true。
参数说明:
| 参数 | 说明 |
| --- | --- |
| enable | 是否开启热更新 |
| name | 简单点说就是监控那些类型的文件变动 |
| include | 简单点说就是监控那些路径下的文件变动 |
| exclude | 排除目录 |
## 连接池
`think-swoole` 默认有实现数据库和缓存连接池功能,涵盖了日常开发的主要场景。
最新的`swoole`版本支持[一键协程](https://wiki.swoole.com/#/runtime),比如`redis`、`mysql`等等,很方便。连接池是在这个基础上,解决一些问题和对性能的再一次提升。
要开启一键协程,需要配置如下参数
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/66/c5/66c57507adea3a39dbe4495abd2d2e29_546x168.png)
这里需要设置为true,默认已经打开,flags默认即可。
连接池的配置参数如下:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/5c/93/5c93c3a94b9c5f3da44b4cb9563b3e8c_512x504.png)
参数说明:
| 参数 | 说明 |
| --- | --- |
| enable | 开关,不需要设置false |
| max\_active | 最大连接数,超过将不再新建连接 |
| max\_wait\_time | 超时时间 |
其中的`max_active`和`max_wait_time`需要根据自身业务和环境进行适当调整,最大化提高系统负载。
';
验证码
最后更新于:2022-04-02 07:54:37
## 安装
首先使用`Composer`安装`think-captcha`扩展包:
~~~
composer require topthink/think-captcha
~~~
>[danger] 验证码库需要开启Session才能生效。
## 使用
扩展包内定义了一些常见用法方便使用,可以满足大部分常用场景,以下示例说明。
在模版内添加验证码的显示代码
~~~
~~~
可以用`Captcha`类的`check`方法检测验证码的输入是否正确,
~~~
// 检测输入的验证码是否正确,$value为用户输入的验证码字符串
$captcha = new Captcha();
if( !$captcha->check($value))
{
// 验证失败
}
~~~
或者直接调用封装的一个验证码检测的函数`captcha_check`
~~~
// 检测输入的验证码是否正确,$value为用户输入的验证码字符串
if( !captcha_check($value ))
{
// 验证失败
}
~~~
如果你需要生成多个不同设置的验证码,可以使用下面的配置方式:
```
[
'codeSet'=>'1234567890'
]
];
```
使用指定的配置生成验证码:
~~~
return Captcha::create('verify');
~~~
默认情况下,验证码的字体是随机使用扩展包内 `think-captcha/assets/ttfs`目录下面的字体文件,我们可以指定验证码的字体,例如:
修改或新建配置文件如下:
```
[
'fontttf'=>'1.ttf'
]
];
```
~~~
return Captcha::create('verify');
~~~
> 默认的验证码字符已经剔除了易混淆的`1l0o`等字符
{:captcha_img()}
~~~
或者
~~~
~~~
> 上面两种的最终效果是一样的,根据需要调用即可。
然后使用框架的内置验证功能(具体可以参考验证章节),添加`captcha`验证规则即可
~~~
$this->validate($data,[
'captcha|验证码'=>'require|captcha'
]);
~~~
如果没有使用内置验证功能,则可以调研内置的函数手动验证
~~~
if(!captcha_check($captcha)){
// 验证失败
};
~~~
如果是多应用模式下,你需要自己注册一个验证码的路由。
```
Route::get('captcha/[:config]','\\think\\captcha\\CaptchaController@index');
```
## 配置
`Captcha`类带有默认的配置参数,支持自定义配置。这些参数包括:
| 参数 | 描述 | 默认 |
| --- | --- | --- |
| codeSet | 验证码字符集合 | 略 |
| expire | 验证码过期时间(s) | 1800 |
| math| 使用算术验证码 | false |
| 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 |
直接在应用的`config`目录下面的`captcha.php`文件中进行设置即可,例如下面的配置参数用于输出4位数字验证码。
```
return [
'length' => 4,
'codeSet' => '0123456789',
];
```
## 自定义验证码
如果需要自己独立生成验证码,可以调用`Captcha`类(`think\captcha\facade\Captcha`)操作。
在控制器中使用下面的代码进行验证码生成:
~~~
think助手工具库
最后更新于:2022-04-02 07:54:34
### 常用的一些扩展类库
目前已有字符串操作,数组操作.
安装
```
composer require topthink/think-helper
```
> 更新完善中
> 以下类库都在`\think\helper`命名空间下
## Str
> 字符串操作
```
use think\\helper\\Str;
// 检查字符串中是否包含某些字符串
Str::contains($haystack, $needles)
// 检查字符串是否以某些字符串结尾
Str::endsWith($haystack, $needles)
// 获取指定长度的随机字母数字组合的字符串
Str::random($length = 16)
// 字符串转小写
Str::lower($value)
// 字符串转大写
Str::upper($value)
// 获取字符串的长度
Str::length($value)
// 截取字符串
Str::substr($string, $start, $length = null)
//驼峰转下划线
Str::snake($value, $delimiter = '_')
//下划线转驼峰(首字母小写)
Str::camel($value)
//下划线转驼峰(首字母大写)
Str::studly
//转为首字母大写的标题格式
Str::title($value)
```
## Arr
> 数组操作
```
use think\\helper\\Arr;
```
#### 判断能否当做数组一样访问
```
//数组返回真
//模型查询的结果也为真
Arr::accessible($value)
```
#### 向数组添加一个元素,支持"点"分割
```
Arr::add($array, $key, $value)
//如下操作
$arr = [];
$arr = Arr::add($arr,'name.3.ss','thinkphp'); //本行结果$arr['name'][3]['ss'] = 'thinkphp'
Arr::add($arr,'name','thinkphp2');//本行不会产生影响,因为'name'已存在.
```
#### 将数据集管理类转换为数组
```
Arr::collapse($array)
```
#### 排列数组组合
```
$arr = Arr::crossJoin(['dd'],['ff'=>'gg'],[2],[['a'=>'mm','kk'],'5']);
//上面行没有什么意义,但是可以看到该函数的作用,数组索引被忽略,数组得值被全部组合
$arr = Arr::crossJoin(['a','b','c'],['aa','bb','cc','dd']);
//这一行可以看到组合的效果,返回一个二维数组,第二维每个数组是的给定值排列,比如(a,aa),(a,bb),(a,cc)...直到(c,dd)
```
';
Workerman
最后更新于:2022-04-02 07:54:32
## Workerman
> Workerman是一款纯PHP开发的开源高性能的PHP socket 服务器框架。被广泛的用于手机app、手游服务端、网络游戏服务器、聊天室服务器、硬件通讯服务器、智能家居、车联网、物联网等领域的开发。 支持TCP长连接,支持Websocket、HTTP等协议,支持自定义协议。基于workerman开发者可以更专注于业务逻辑开发,不必再为PHP Socket底层开发而烦恼。
## 安装
首先通过 composer 安装
~~~
composer require topthink/think-worker
~~~
## 使用
### 使用`Workerman`作为`HttpServer`
在命令行启动服务端
~~~
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
~~~
> 注意:使用默认worker做服务器时,`dump`会打印到命令行.
### 关于上传文件
当按照默认的worker做http服务器时,并不能直接使用`request()->file('image')`来获得上传的文件,具体可以参考[workerman的上传文件第6点](http://doc.workerman.net/web-server.html).因此只能迂回的使用`Filesystem`.无论怎样,不影响其`getMime()`等方法的正确性.
```
// $file = request()->file('image');
$file_data = $_FILES[0]['file_data'];
//$tmp_file = tempnam('','tm_'); 这种写法最终保存时扩展名为.tmp
$tmp_file = sys_get_temp_dir().'/'.uniqid().'.'.explode('/',$_FILES[0]['file_type'])[1];
file_put_contents($tmp_file,$file);
$file = new File($tmp_file);
$savename = Filesystem::putFile('upload',$file);
echo $savename;
```
### 自定义workerman指令
有时候我们希望使用think的命令行运行workerman,这里做一个介绍,
1:先新建一个指令,参考文档:[自定义指令](https://www.kancloud.cn/manual/thinkphp6_0/1037651),比如新建命令:
```
php think make:command Hello hello
```
2:复制下面的代码到指令里,覆盖原始的`configure`和`execute`方法
```
protected function configure()
{
// 指令配置
$this->setName('convert')
->addArgument('action', Argument::OPTIONAL, "start|stop|restart|reload|status|connections", 'start')
->addOption('mode', 'm', Option::VALUE_OPTIONAL, 'Run the workerman server in daemon mode.')
->setDescription('the workerman command');
}
protected function execute(Input $input, Output $output)
{
// 指令输出
$output->writeln('convert start');
$action = $input->getArgument('action');
$mode = $input->getOption('mode');
// 重新构造命令行参数,以便兼容workerman的命令
global $argv;
$argv = [];
array_unshift($argv, 'think', $action);
if ($mode == 'd') {
$argv[] = '-d';
} else if ($mode == 'g') {
$argv[] = '-g';
}
// 在这里放心的实例化worker,
// 就像参照workerman文档写一样,
// 无非在workerman的文档里,代码是新建纯php文件,但在这里,写到了一个方法里.
$worker_1 = new Worker();
$worker_2 = new Worker();
Worker::runAll();
}
```
3:运行的时候,使用如下命令:
```
//临时运行
php think hello start
//后台运行
php think hello start --mode d
```
';
数据库迁移工具
最后更新于:2022-04-02 07:54:30
## 数据库迁移工具
使用数据库迁移工具可以将数据库结构和数据很容易的在不同的数据库之间管理迁移。
在以前,为了实现“程序安装”,你可能会导出一份sql文件,安装时,用程序解析这个sql文件,执行里面的语句,这样做有诸多的局限性,但现在使用数据库迁移工具,你可使用一个强大的类库API来创建数据库结构和记录,并且可以容易的安装到Mysql,sqlite,sqlserver等数据库。
原项目手册:[phinx](https://book.cakephp.org/phinx/0/en/index.html)
使用范例:
> 使用之前你应当正确的连接到数据库,不论是mysql,sqlite,sqlserver
### 安装
```
composer require topthink/think-migration
```
### 创建迁移工具文件
```
//执行命令,创建一个操作文件,一定要用大驼峰写法,如下
php think migrate:create AnyClassNameYouWant
//执行完成后,会在项目根目录多一个database目录,这里面存放类库操作文件
//文件名类似/database/migrations/20190615151716_any_class_name_you_want.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();
}
}
```
### 执行迁移工具
```
php think migrate:run
//此时数据库便创建了prefix_users表.
```
> 数据库会有一个migrations表,这个是工具使用的表,不要修改
### 例子
~~~
$table = $this->table('followers', ['id' => false, 'primary_key' => ['user_id', 'follower_id']]);
$table->addColumn('user_id', 'integer')
->addColumn('follower_id', 'integer')
->addColumn('created', 'datetime')
->addIndex(['email','username'], ['limit' => ['email' => 5, 'username' => 2]])
->addIndex('user_guid', ['limit' => 6])
->create();
~~~
### 表支持的参数选项
| 选项 | 描述 |
| -- | ------ |
| comment | 给表结构设置文本注释 |
| row\_format | 设置行记录模格式|
| engine | 表引擎 *(默认 ``InnoDB``)* |
| collation | 表字符集 *(默认 ``utf8\_general\_ci``)* |
| signed | 是否无符号 `signed` *(默认 ``true``)* |
### 常用列
* biginteger
* binary
* boolean
* date
* datetime
* decimal
* float
* integer
* string
* text
* time
* timestamp
* uuid
### 所有的类型都支持的参数
| Option | Description |
| --- | --- |
| limit | 文本或者整型的长度 |
| length | `limit`别名 |
| default | 默认值 |
| null | 允许 `NULL` 值 (不该给主键设置 |
| after | 在哪个字段名后 *(只对MySQL有效)* |
| comment | 给列设置文本注释 |
### 索引的用法
```
->addIndex(['email','username'], ['limit' => ['email' => 5, 'username' => 2]])
->addIndex('user_guid', ['limit' => 6])
->addIndex('email',['type'=>'fulltext'])
```
如上面例子所示,默认是`普通索引`,mysql可设置生效`复合索引`,mysql可以设置`fulltext`.
## 自动版本升级降级
该项目可以升级和还原,就像git/svn一样rollback。
如果希望实现自动升级降级,那就把逻辑写在change方法里,只最终调用`create`和`update`方法,不要调用`save`方法。
`change`方法内仅支持以下操作
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
如果真的有调用其他方法,可以写到`up`和`down`方法里,这里的逻辑不支持自动还原,up写升级的逻辑,down写降级的逻辑。
~~~
public function change()
{
// create the table
$table = $this->table('user_logins');
$table->addColumn('user_id', 'integer')
->addColumn('created', 'datetime')
->create();
}
/**
* Migrate Up.
*/
public function up()
{
}
/**
* Migrate Down.
*/
public function down()
{
}
~~~
';
扩展库
最后更新于:2022-04-02 07:54:28
[数据库迁移工具](%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%81%E7%A7%BB%E5%B7%A5%E5%85%B7.md)
[Workerman](Workerman.md)
[think助手工具库](think%E5%8A%A9%E6%89%8B%E5%B7%A5%E5%85%B7%E5%BA%93.md)
[验证码](%E9%AA%8C%E8%AF%81%E7%A0%81.md)
[Swoole](Swoole.md)
';
自定义指令
最后更新于:2022-04-02 07:54:25
## 创建自定义指令
第一步,创建一个自定义命令类文件,运行指令
~~~
php think make:command Hello hello
~~~
会生成一个`app\command\Hello`命令行指令类,我们修改内容如下:
~~~
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`选项。
第二步,配置`config/console.php`文件
~~~
[
'hello' => 'app\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 kancloud
~~~
输出
~~~
Hello kancloud!
~~~
添加`city`选项
~~~cmd
php think hello kancloud --city shanghai
~~~
输出
~~~
Hello kancloud!
From shanghai
~~~
>[danger] 注意看参数和选项的调用区别
>
如果需要生成一个指定的命名空间,可以使用:
~~~
php think make:command app\index\Command second
~~~
## 在控制器中调用命令
支持在控制器的操作方法中直接调用命令,例如:
~~~
fetch();
}
}
~~~
访问该操作方法后,例如:
~~~
http://serverName/index/hello/name/thinkphp
~~~
页面会输出
~~~
Hello thinkphp!
~~~
## 命令行选项
```
use think\\console\\input\\Option;
// 无需传值
Option::VALUE_NONE = 1;
// 必须传值
Option::VALUE_REQUIRED = 2;
// 可选传值
Option::VALUE_OPTIONAL = 4;
// 传数组值
Option::VALUE_IS_ARRAY = 8;
```
## addOption
```
/**
* 添加选项
* @param string $name 选项名称
* @param string $shortcut 别名
* @param int $mode 类型
* @param string $description 描述
* @param mixed $default 默认值
* @return Command
*/
public function addOption(string $name, string $shortcut = null, int $mode = null, string $description = '', $default = null)
```
### 示例
定义如下:
```
->addOption('adminname', 'p', Option::VALUE_OPTIONAL, '管理员账号')
```
调用方式可以如下:
```
// 无需任何参数
php think install
// 使用全名参数
php think install --adminuser admin
// 使用缩写
php think install -u admin
```
指令逻辑中可以这样获取:
```
$input->getOption('adminname');
```
';
输出路由定义
最后更新于:2022-04-02 07:54:23
## 输出并生成路由列表
假设你的路由定义文件内容为:
~~~
Route::get('think', function () {
return 'hello,ThinkPHP6!';
});
Route::resource('blog', 'Blog');
Route::get('hello/:name', 'index/hello')->ext('html');
~~~
可以使用下面的指令查看定义的路由列表
~~~
php think route:list
~~~
如果是多应用模式的话,需要改成
~~~
php think route:list index
~~~
输出结果类似于下面的显示:
~~~
+----------------+-------------+--------+-------------+
| Rule | Route | Method | Name |
+----------------+-------------+--------+-------------+
| 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 │
├────────────────┼─────────────┼────────┼─────────────┤
│ 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 ║
╠────────────────╪─────────────╪────────╪─────────────╣
║ 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 |
|----------------|-------------|--------|-------------|
| 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 |
+----------------+-------------+--------+-------------+
| 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 |
+----------------+-------------+--------+-------------+
| 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 07:54:21
## 生成路由映射缓存`optimize:route`
>[danger] 路由映射缓存用于开启路由延迟解析的情况下,支持路由反解的URL生成,如果你没有开启路由延迟解析或者没有使用URL路由反解生成则不需要生成。
生成路由映射缓存的命令:
~~~cmd
php think optimize:route
~~~
执行后,会在`runtime`目录下面生成`route.php`文件。
如果是多应用模式的话,需要增加应用名参数调用指令
~~~cmd
php think optimize:route index
~~~
';
生成数据表字段缓存
最后更新于:2022-04-02 07:54:19
## 生成数据表字段缓存`optimize:schema`
>[danger] 字段缓存仅在部署模式下生效,并且仅适用于使用`think-orm`的情况,如果你使用了其它的ORM库,则不支持生成。
可以通过生成数据表字段信息缓存,提升数据库查询的性能,避免多余的查询。命令如下:
~~~cmd
php think optimize:schema
~~~
如果是多应用模式,你可以使用下面的指令生成`admin`应用的字段缓存。
~~~cmd
php think optimize:schema admin
~~~
会自动生成当前数据库配置文件中定义的数据表字段缓存,也可以指定数据库生成字段缓存(必须有用户权限),例如,下面指定生成`demo`数据库下面的所有数据表的字段缓存信息。
~~~cmd
php think optimize:schema --db demo
~~~
>[danger] `V6.0.3+`版本开始,取消了`--db`选项,改用`--connection`选项指定使用的数据库连接来生成,并且缓存用内置的缓存机制替代之前的文件方式。
~~~cmd
php think optimize:schema --connection mysql
~~~
>[danger] 没有继承think\Model类的(抽象)模型类不会生成。如果定义了公共模型类,最好把公共模型类定义为抽象类(`abstract`)。
更新数据表字段缓存也是同样的方式,每次执行都会重新生成缓存。如果需要单独更新某个数据表的缓存,可以使用:
~~~cmd
php think optimize:schema --table think_user
~~~
支持指定数据库名称
~~~cmd
php think optimize:schema --table demo.think_user
~~~
> 需要在数据库配置中设置`fields_cache`为`true`才能生成缓存
';
清除缓存文件
最后更新于:2022-04-02 07:54:16
## 清除缓存文件`clear`
如果需要清除应用的缓存文件,可以使用下面的命令:
~~~cmd
php think clear
~~~
不带任何参数调用`clear`命令的话,会清除`runtime`目录(包括模板缓存、日志文件及其子目录)下面的所有的文件,但会保留目录。
如果不需要保留空目录,可以使用
~~~cmd
php think clear --dir
~~~
清除日志目录
~~~cmd
php think clear --log
~~~
清除日志目录并删除空目录
~~~cmd
php think clear --log --dir
~~~
清除数据缓存目录
~~~cmd
php think clear --cache
~~~
清除数据缓存目录并删除空目录
~~~cmd
php think clear --cache --dir
~~~
如果需要清除某个指定目录下面的文件,可以使用:
~~~cmd
php think clear --path d:\www\tp\runtime\log\
~~~
';
创建类库文件
最后更新于:2022-04-02 07:54:14
## 快速生成控制器
执行下面的指令可以生成`index`应用的`Blog`控制器类库文件
~~~cmd
>php think make:controller index@Blog
~~~
如果是单应用模式,则无需传入应用名
~~~cmd
>php think make:controller Blog
~~~
默认生成的是一个资源控制器,类文件如下:
~~~
php think make:controller index@Blog --plain
~~~
生成的控制器类文件如下:
~~~
php think make:controller index@test/Blog --plain
~~~
会生成一个 `app\index\controller\test\Blog` 控制器类。
可以支持 --api 参数生成用于API接口的资源控制器。
## 快速生成模型
和生成控制器类似,执行下面的指令可以生成`index`应用的`Blog`模型类库文件
~~~cmd
>php think make:model index@Blog
~~~
如果是单应用模式,无需传入应用名
~~~cmd
>php think make:model Blog
~~~
生成的模型类文件如下:
~~~
php think make:controller index@BlogController
~~~
~~~cmd
>php think make:model BlogModel
~~~
## 快速生成中间件
可以使用下面的指令生成一个中间件类。
~~~cmd
>php think make:middleware Auth
~~~
会自动生成一个 `app\middleware\Auth`类文件。
## 创建验证器类
可以使用
~~~cmd
>php think make:validate index@User
~~~
生成一个 `app\index\validate\User` 验证器类,然后添加自己的验证规则和错误信息。
';
自动生成应用目录
最后更新于:2022-04-02 07:54:12
ThinkPHP 具备自动创建功能,可以用来自动生成需要的应用及目录结构和文件等。
>[danger] 本指令需要安装多应用扩展后才支持。
## 快速生成应用
如果使用了多应用模式,可以快速生成一个应用,例如生成`demo`应用的指令如下:
~~~cmd
>php think build demo
~~~
如果看到输出
~~~
Successed
~~~
则表示自动生成应用成功。
会自动生成`demo`应用,自动生成的应用目录包含了`controller`、`model`和`view`目录以及`common.php`、`middleware.php`、`event.php`和`provider.php`等文件。
生成成功后,我们可以直接访问`demo`应用
会显示
```
您好!这是一个[demo]示例应用
```
## 应用结构自定义
如果你希望自定义生成应用的结构,可以在app目录下增加一个`build.php`文件,内容如下:
~~~
return [
// 需要自动创建的文件
'__file__' => [],
// 需要自动创建的目录
'__dir__' => ['controller', 'model', 'view'],
// 需要自动创建的控制器
'controller' => ['Index'],
// 需要自动创建的模型
'model' => ['User'],
// 需要自动创建的模板
'view' => ['index/index'],
];
~~~
可以给定义需要自动生成的文件和目录,以及MVC类。
* `__dir__` 表示生成目录(支持多级目录)
* `__file__` 表示生成文件(默认会生成`common.php`、`middleware.php`、`event.php`和`provider.php`文件,无需定义)
* `controller `表示生成控制器类
* `model`表示生成模型类
* `view`表示生成模板文件(支持子目录)
并且会自动生成应用的默认`Index`访问控制器文件用于显示应用的欢迎页面。
';
查看版本
最后更新于:2022-04-02 07:54:09
## 查看版本
查看当前框架版本
~~~cmd
php think version
~~~
输出显示
```
v6.0.0
```
';
启动内置服务器
最后更新于:2022-04-02 07:54:07
## 启动内置服务器
命令行切换到应用根目录后,输入:
~~~cmd
>php think run
~~~
如果启动成功,会输出下面信息,并显示`web`目录位置。
~~~
ThinkPHP Development server is started On
You can exit with `CTRL-C`
Document root is: D:\WWW\tp6/public
~~~
然后你可以直接在浏览器里面访问
~~~
http://127.0.0.1:8000/
~~~
而无须设置`Vhost`,不过需要注意,这个只有web服务器,其它的例如数据库服务的需要自己单独管理。
支持制定IP和端口访问
~~~cmd
>php think run -H tp.com -p 80
~~~
会显示
~~~
ThinkPHP Development server is started On
You can exit with `CTRL-C`
Document root is: D:\WWW\tp6/public
~~~
然后你可以直接在浏览器里面访问
~~~
http://tp.com/
~~~
';
命令行
最后更新于:2022-04-02 07:54:05
ThinkPHP6支持`Console`应用,通过命令行的方式执行一些URL访问不方便或者安全性较高的操作。
我们可以在cmd命令行下面,切换到应用根目录(注意不是web根目录),然后执行`php think`,会出现下面的提示信息:
```shell
>php think
version 6.0.0
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
help Displays help for a command
list Lists commands
run PHP Built-in Server for ThinkPHP
version show thinkphp framework version
make
make:command Create a new command class
make:controller Create a new resource controller class
make:event Create a new event class
make:listener Create a new listener class
make:middleware Create a new middleware class
make:model Create a new model class
make:service Create a new Service class
make:subscribe Create a new subscribe class
make:validate Create a validate class
optimize
optimize:config Build config and common file cache.
optimize:facade Build facade ide helper.
optimize:route Build app route cache.
optimize:schema Build database schema cache.
route
route:build Build Annotation route rule.
route:list show route list.
service
service:discover Discover Services for ThinkPHP
vendor
vendor:publish Publish any publishable assets from vendor packages
```
`console`命令的执行格式一般为:
>[info]### >php think 指令 参数
下面介绍下系统自带的几个命令,包括:
|指令 | 描述|
|---|---|
|build|自动生成应用目录和文件|
|help|帮助|
|list|指令列表|
|clear|清除缓存指令|
|run|启动PHP内置服务器|
|version|查看当前框架版本号|
|make:controller|创建控制器类|
|make:model|创建模型类|
|make:command|创建指令类文件|
|make:validate|创建验证器类|
|make:middleware|创建中间件类|
|make:event|创建事件类|
|make:listener|创建事件监听器类|
|make:subscribe|创建事件订阅者类|
|make:service|创建系统服务类|
|optimize:autoload|生成类库映射文件|
|optimize:config|生成配置缓存文件|
|optimize:schema|生成数据表字段缓存文件|
|optimize:facade|生成Facade注释|
|route:build|生成注解路由|
|route:list|查看路由定义|
|service:discover|自动注册扩展包的系统服务|
|vendor:publish|自动生成扩展的配置文件|
更多的指令可以自己扩展。
';