更新日志

最后更新于:2022-04-01 21:27:07

# 版本更新日志 [TOC=2,2] ## 2019-1-11 V5.0.24 本次更新包含了一个安全更新,建议更新 - 改进多对多关联的`save`方法 - 改进模型数据验证 - Collection增加`values`方法 - 改进`unique`验证方法 - 改进Request类的`method`方法 ## 2018-12-9 V5.0.23 本次版本更新主要涉及一个安全更新,推荐尽快更新到最新版本。 * Query支持调用模型的查询范围 * 聚合查询字段支持`DISTINCT` * 改进闭包验证的参数 * 多对多关联支持指定中间表数据名称 * after/before验证支持指定字段验证 * 改进多对多关联 * 改进验证类 * 增加`afterWith`和`beforeWith`验证规则 用于比较日期字段 * 完善规则提示 * 改进断线重连 * 修正软删除的`destroy`方法 * 修复模型的`save`方法当`data`变量为空 数据不验证 * 模型增加`replace`方法 * MorphOne 增加 make 方法创建关联对象实例 * 改进`count`方法返回值类型 * 改进聚合查询方法的正则判断 * 改进`sqlsrv`驱动 * 完善关联的`save`方法 * 修正控制器名获取 ## 2018-10-22 V5.0.22 该版本主要增加了JSON日志格式的支持,并且包含了一个安全更新。 调试模式下关闭路由解析缓存 * 改进Log类支持`json`日志格式 * 改进聚合查询的安全性 * 改进`count`查询的返回值类型 ## 2018-9-7 V5.0.21 该版本主要做了一些已知问题的修正,改进了对Swoole的支持,以及增加路由解析缓存功能。 * 增加路由解析缓存功能 * 改进url生成的端口问题 * 改进缓存驱动 * 改进value方法的缓存处理 * 修正Builder类的insertAll方法 * 改进对Swoole的支持(使用参考:[xavier-swoole](https://github.com/xavieryang007/xavier-swooleundefined)) ## 2018-5-11 V5.0.20 该版本为修正版本,修正了一些已知的问题。 * `join`方法的条件支持传入`Expression`对象 * 改进驱动的`parseKey`方法 * 改进Request类的`host`方法 * 使用`exp`表达式更新数据的异常提示 * 修正查询 * 改进多对多关联的中间表模型更新 ## 2018-4-25 V5.0.19 该版本属于改进版本,主要改进了composer自动加载及内置模板引擎的一处可能的安全隐患。 * 改进composer自动加载 * 改进模板引擎一处安全隐患 * 改进`comment`方法解析 * 改进分布式写入数据后及时读取的问题 * 改进url操作方法的自动转换 * 改进分页类魔术方法的返回值 * SQL日志增加主从标记 ## 2018-4-14 V5.0.18 该版本主要修正上一个发布的一些BUG,并且改进了`exp`表达式查询/写入的严谨性。 * 修正`field`方法`*`兼容问题; * 修正`inc/dec`方法; * 修正`setInc/setDec`方法; * 改进`insertAll`方法; * 改进`parseTime`方法; * 改进`exp`表达式查询/写入的严谨性; ## 2018-4-12 V5.0.17 该版本主要是一些修正和改进,并且包含了一个安全更新。 * 改进Response类`create`方法 * 改进`inc/dec`查询 * 默认模板渲染规则支持直接使用操作方法名 * 改进视图驱动 * 改进Request类ip方法 支持代理设置 * 修正request类的`create`方法 * 闭包查询使用`cache(true)`抛出异常 * 改进composer自动加载文件 * 增加`Expression`类及相关方法 ## 2018-3-26 V5.0.16 该版本主要做了一些修正和改进,由于包含了一个安全更新,是一个推荐更新的版本。 * 改进Url生成 * 改进composer自动加载性能 * 改进一对一查询 * 改进查询缓存 * 改进field方法 * 优化Template类 * 修正分页参数 * 改进默认模板的自动识别 * 改进Query类查询 * Collection类改进 * 改进模型类`readTransform`方法对序列化类型的处理 * 改进trace显示 * 文件日志支持自动清理 * 改进断线重连的判断 * 改进验证方法 * 修正Query类view方法的数组表名定义 * 改进参数绑定 * 改进文件缓存的并发删除 * 改进`inc/dec/exp`更新的安全性 * 增加控制台配置 ## 2018-1-31 V5.0.15 该版本主要进行了一些修正和完善 * 改进View类 * 改进chunk方法 * 改进模板引擎的表达式语法 * 改进自关联查询多级调用问题 * 关联定义增加`selfRelation`方法用于设置是否自关联 * 改进file类型的缓存`inc`和`dec`方法不改变缓存有效期 * 改进软删除 支持设置`deleteTime`属性关闭 * 改进`union`查询 * 改进查询缓存 * 优化File缓存自动生成空目录的问题 * 改进日志写入并发问题 * 修正`MorphTo`关联 * 改进`join`自关联查询 * 改进`case`标签解析 * 改进Url类对`url_convert`配置的支持 ## 2018-1-1 V5.0.14 V5.0.14版本主对复合主键进行了更多支持,改进了PHP7的兼容性,并且对数据库的一些问题做了改进。 主要更新如下: * 改进Validate类的unique验证 * Validate类增加checkRule方法用于静态验证多个规则 * 改进多对多关联的save方法 * 改进多对多的pivot对象 * 修正setDec方法的延迟写入 * max和min方法增加第二个参数用于设置是否强制转换数字 * 改进View类 * 改进join关联自身的问题 * 改进union查询 * 改进Url类 * 改进同名路由不同请求的注册 * 改进Builder类parseData对空数组的判断 * 改进模板替换 * 调整BelongsTo的hasWhere方法 * 改进模板的编译缓存命名规则 增加布局模板的标识 * 改进insertall方法 * 改进chunk方法支持复合主键 * 改进Error类的一个兼容问题 * 改进model类的save方法的复合主键包含自增的情况 * save方法改进复合主键的支持 * 改进mysql的insertAll方法 * 改进redis长连接多编号库的情况 ## 2017-12-12 V5.0.13 `V5.0.13`主要是对模型和日志方面做了一些改进 ### \[数据库和模型\] * 改进Model类`save`方法对`oracle`的支持 * 改进中间表模型的实例化 * 改进`Pivot`类 * 模型`saveall`方法支持配合`isUpdate`方法 * 模型类增加`force`方法设置是否强制更新所有数据 * 关联自动删除增加一对多关联删除支持 * 改进`hasWhere`查询的数据重复问题 * 改进一对多`with`关联查询的`field`支持 * 模型`saveall`方法支持返回数据集 读取`resultSetType`属性 * 改进废弃字段判断 * 模型的`hasWhere`方法增加`fields`参数 * 改进断线重连异常捕获机制 * 修正Query类的`inc`和`dec`方法的Mysql关键词问题 * 修正数据集对象的BUG ### \[其它\] * 增加`app_dispatch`钩子位置 * cookie类`httponly`参数默认改为false * File日志驱动增加`single`参数配置是否记录单个文件日志 * 单个日志文件支持大小设置 * 改进日志记录的ip地址 * Redis缓存驱动改用`serialize`序列化替代json序列化 * 改进异常捕获 * 改进上传文件验证 * 修正redis驱动 * 改进File缓存的`clear`方法 * 代码格式化规范 * 改进一处PHP7.2的兼容问题 * 调试模式下不读取字段缓存文件 * `default_filter`支持在模块中配置生效 ## 2017-11-06 V5.0.12 5.0.12是一个修正版本,包含了上个版本发布以来的一些修正和完善,主要包括: * 上传类和验证类的多语言支持; * 模型增加排除和废弃字段支持; * 改进insertAll方法的分批处理; * 改进对枚举类型的参数绑定支持; * 修正社区反馈的问题; ### \[数据库和模型\] * 改进Connection类的getRealSql方法 * 改进append方法支持一对一关联的bind设置 * 改进whereTime查询 * 改进model类的`destroy`方法 * 修正softdelete * 修正`chunk`方法对时间字段的支持 * Collection类增加`push`方法 * 改进alias方法 * 修正模型类的`append`处理 * 改进`appendRelationAttr`方法 * 改进HasManyThrough关联 * 改进MorphTo关联 * 模型增加废除字段`disuse`定义 * 增加排除字段方法`except` * 修正`has`方法 * 改进参数绑定类型对枚举类型的支持 * 改进`insertAll`方法的分批处理 ### \[其它\] * 改进Loader类`controller`和`validate`方法支持多层 * 验证提示信息支持多语言 * File类错误信息支持多语言 * 模板渲染异常处理 * 修正rest控制器 * 改进trace驱动 * 改进Cache类的`remember`方法 * 改进`url_common_param`的情况下urlencode的问题 * 改进Url类 * 改进`exception_handle`配置参数对闭包的支持 * 执行路由缓存命令前检测RUNTIME\_PATH是否存在 * 调整部分`CacheDriver::dec`在为空的时候递减的行为 * 优化移动端的显示 * 改进对JSON-Handle插件的支持 * 改进redis的`get`方法 * 改进Request类的`host`方法 ## 2017-09-08 V5.0.11 5.0.11是一个安全及修正版本,包含了上个版本发布以来的一些修正和完善,更新了几处可能的安全问题,主要包括: * 完善缓存驱动; * 改进数据库查询; * 改进URL生成类; * 缓存有效期支持指定过期时间; ### \[数据库和模型\] * 改进数据库驱动类 * 改进`group`方法的字段关键字冲突 * 修正聚合查询返回null的问题 * 改进Db类的强制重连 * 改进关联的属性绑定 * 修正事务的断线重连 * 修正对象的条件查询 * Db类增加`clear`方法 * 改进数组查询条件中的`null`查询 * 改进Query类的`chunk`方法支持排序设置 * 改进HasOne和HasMany关联的`has`方法 * 改进软删除的关联删除 * 改进一个字段多次查询条件 ### \[其它\] * 缓存有效期支持指定过期时间(`DateTime`); * 改进Url生成对端口号的支持 * 改进`RouteNotFound`异常提示 * 改进路由分组的全局完整路由匹配 * 修正部分验证规则的错误提示问题 * 支持数据集和模型的XML响应输出 * 改进模板的三元运算标签 * 改进控制器不存在的错误提示 * input助手函数支持`route`变量获取 * 支持在配置文件中读取额外配置参数 * 完善分页类 * 修复Trait命名空间重复问题 * 修正Request类的env方法 * 优先使用Cookie中的多语言设置 * 获取缓存标签的时候过滤无效的缓存标识 * 修正路由批量注册的一个BUG * `exception_handle`配置参数支持使用闭包定义`render`处理 * 请求缓存支持缓存标签设置 * 缓存类`remember`方法增加并发锁定机制 * 改进上传类对`swf`的支持 * 改进Session类的`prefix`方法 ## 2017-07-04 V5.0.10 5.0.10是一个修正版本,并包含了一个安全更新,推荐更新,主要包含: * 数据库和模型的多处改进 * 添加新的行为监听 * 路由支持Response设置 * 改进调试模式下数据库敏感信息暴露 ### \[数据库和模型\] * 修正join其他表时生成的delete语句错误 * 修正远程一对多 * insertall支持replace * 修正多对多默认的中间表获取 * 改进更新后的模型`update_time`数据更新 * model类增加`removeRelation`方法 * 模型类增加`setInc`和`setDec`方法 * 模型类增加`autoWriteTimestamp`方法动态设置时间字段写入 * 改进驱动类方法的断线重连判断 * 改进多对多的数据更新 * 改进BelongsToMany关联查询 * 修正Query类的value和column方法 * 改进in查询的去重问题 * 修正模型类的scope方法传值问题 * 调整模型的save方法`before_update`检查位置 * 修改器和获取器方法支持第三个关联数据参数 ### \[其它\] * 默认关闭调试模式 * 修复配置extra目录临时文件的错误加载 * 添加log存储完成行为监听 `log_write_done` * 改进Build类生成公共文件的目录判断 * 增加`response_send`行为监听 * 路由增加response参数用于绑定response处理行为 * 改进redirect的参数传入 * 改进环境变量的布尔值读取 * 改进Url类的域名传入 * 修正命令行文件生成 * 改进命令行下面的URL生成 * 添加`app_host`参数设置默认的URL根地址 * 改进`Request`类`isSsl`方法判断支持CDN * 增加`record_trace`配置参数用于日志记录trace信息 ## 2017-05-20 V5.0.9 5.0.9是一个修正版本,推荐更新,主要更新包含: ### \[数据库和模型\] * 修正关联自动写入 * 修正模型数据变化判断对为空数据的支持 * 修正Query类的useSoftDelete方法返回值 * 修正一对一嵌套关联数组定义的问题 * 修正使用了手动参数绑定的时候的缓存BUG * 改进数据库类的一处不能嵌套查询的缺陷 * 改进数据库断线重连判断 * 改进模型的appendRelationAttr方法 * 改进模型类destroy方法传入空数组的时候不进行任何删除操作 * 改进一对多关联数据的输出 * 改进模型的save方法对allowField方法的支持 * 改进分页类的toarray方法 增加总页数 * 比较运算增加闭包子查询支持 * db助手函数默认不再强制重新连接 * 改进belongsToMany的查询字段指定 * 分页类增加each方法 ### \[其它\] * 修正路由分组的路由规则大小写识别问题 * 修正命令行的日志切割生成 * 修复URL生成时路由规则中的参数没有进行 urlencode * 改进Request类的filter过滤机制 支持正则 * 改进Response类支持手动设置contentType * 修正异常模板中助手函数未定义错误 ## 2017-04-28 V5.0.8 ### 主要调整 * 改进关联模型 * 改进日志记录 * 增加多态一对一关联 * 修正社区反馈的一些BUG ### \[ 请求和路由 \] * 修正Request类`cookie`方法对前缀的支持 * 改进全局请求缓存的缓存标识 * 改进Request类`param`方法 * 修正别名路由 ### \[ 模型和数据库 \] * 改进模型数据的更新检查 * 改进Query类的`column`方法 * 改进软删除条件在使用闭包查询情况下多次生成的问题 * belongsToMany增加数据同步方法 * 查询范围支持静态调用 * 增加多态一对一(MorphOne)关联 * 改进BelongsTo关联 * 改进多态关联支持关联数据添加和注销 * 改进多对多关联,支持中间表模型自定义 并且定义的时候不需要使用完整表名 * 改进浮点数类型转换避免出现逗号 * 调整关联模型的save方法返回值 * 模型类的get方法第一个参数必须 如果传入null则返回null * model的save方法改进如果数据没有更新不执行 * Query增加`useSoftDelete`方法可以单独设置软删除条件 * 重载BelongsToMany的`selectOrFail`和`findOrFail`方法 * 重载BelongsToMany的`select` 、`find`和 `paginate`方法 * 增加模型和`Pivot`对象的`parent`属性 * 多对多关联支持设置中间表模型 * 改进Query类的`view`方法中字段的关键字问题 * 主从数据库的时候开启事务始终操作主库 ### \[ 其它 \] * 改进Cookie类的`get`方法支持获取全部 * `schema`指令增加`config`参数,支持传入数据库连接配置 * 改进cache类的`store`方法为当次有效 * 修正cache助手函数对`option`传参的支持 * 修复`optimize:autoload`命令在`EXTEND_PATH`目录不存在的情况下,类库映射生成错误问题 * 支持自定义的根命名空间也可以生成类库映射缓存 * 验证字段比较支持对比其他字段 * 修复`Session::prefix('xxx');`设置当前作用域BUG * 改进`optimize::schema`指令 * 修复`clear`指令无法删除多级目录下文件的问题 * 改进默认语言读取和自动侦测 * 改进日志记录格式 并且命令行下面日志改为实时写入 * 修正模板标签默认值某些情况无效bug * 改进Url生成对完整域名的支持 * 改进`Clear`指令不删除`.gitignore` 文件 * 修复Memcache缓存驱动的`inc`方法 ### 调整 * 如果自定义了应用的命名空间的话,原来的`app_namespace`配置参数改为`APP_NAMESPACE`常量在入口文件中定义 * 多对多关联的中间表名称不需要添加表前缀 * 模型的scope方法之后只能使用数据库查询方法而不能使用模型的方法 ## 2017-02-24 V5.0.7 ### 主要调整 本次更新主要为BUG修正和改进,主要改进如下: * 改进全局请求缓存对子域名的支持; * 改进数据缓存自动更新机制; * 关联统计支持指定统计属性名; * 模型嵌套关联支持数组方式; * HasOne关联支持`has`和`hasWhere`方法; * 路由的`ext`和`deny_ext`参数允许设置为空(表示不允许任何后缀或者必须使用后缀访问); ### 修正如下 * 修正 IN / NOT IN 型查询条件为空导致的 sql 语法错误 * 修正分页类的`toArray`方法对简洁模式的支持 * 修正Model类`delete`方法对多主键的处理 * 修正软删除对`Mongodb`的支持 * 修正`Connection`类一处可能的错误 * 改进Query类的find方法的缓存机制 * 修正BelongsTo关联 * 修正JOIN方式一对一关联预载入闭包查询 * 修正Query类的`insert`方法一处可能存在的警告错误 * 修正Model类一处Collection的`use`冲突 * 修正Model类`hasWhere`方法 * 修正URl生成对`ext`参数的支持 * 文件缓存`clear`方法会删除空目录 * 修正Route类的`parseUrlPath`方法一处问题 ### 调整如下 * 默认关闭session的安全参数`secure`,此选项仅能在HTTPS下设置开启 ## 2017-02-07 V5.0.6 ### 主要调整: 本次更新主要为BUG修正及优化(可无缝升级): * 数据库支持断线重连机制; * 改进查询事件的回调参数; * 改进数据自动缓存机制; * 增加时间字段自动格式转换设置; * `MongoDb`和`Oracle`扩展更新至最新核心框架; ### \[数据库和模型\] * 修正hasMany关联的`has`方法 * 去除一些数据库惯例配置 避免使用数据库扩展的时候影响 * 改进多对多的`attach`方法的返回值 * 增加Mysql的断线重连机制和开关 * 改进Query类的`find`方法数据缓存机制 * 改进Query类查询事件的回调参数 * 改进Query类的自动缓存更新 * Model类增加`readonly`方法 * 改进Model类的`has`和`hasWhere`方法 * 改进模型类的`get`和`all`方法 第二个参数为true或者数字表示缓存参数 * 修复闭包查询条件为空导致的 sql 语法错误 * 改进Query类的`setBuilder`方法 避免因自定义连接器类后找不到生成器类 * 删除Connection类废弃属性`resultSetType` * 优化Connection类`close`方法 * 修正Connection类的`bindParam`方法对存储过程的支持 * 数据库配置参数`datetime_format` 设置为`false`表示关闭时间字段自动转换输出 * 改进软删除的数据库兼容性问题 支持`Mongodb` ### \[其它\] * 改进Url类生成 `root`为`/`的情况 * redirect助手函数和controller类的redirect方法增加with参数 * 全局请求缓存添加排除规则 添加request\_cache\_except配置参数 * Cache类store方法参数允许为空 表示获取当前缓存驱动句柄 * 改进Validate类的ip验证规则 ## 2017-01-23 V5.0.5 ### 主要调整: 本次更新主要改进了数据访问层和模型关联: * 增加快捷查询及设置方法; * 增加关联统计功能; * 增加关联查询延迟预载入功能; * 增加关联一对一自动写入和删除; * 改进存储过程查询; * 改进关联数据输出; * 优化查询性能; * 模型时间字段自动格式化输出; ### \[请求和路由\] * 改进路由定义的后缀检测 * Route类的`rest`方法支持覆盖定义 * 改进Request类的`put`和`post`方法对`json`格式参数的接收 * Request类增加`contentType`方法 * 改进Route类`setRule`方法 * 改进Request类的`create`方法 * 改进路由到控制器类的方法对默认渲染模板的影响 * 修正Url类`build`方法定义路由别名后的BUG ### \[数据库和模型\] * 增加关联统计功能 * 增加一对一关联自动写入功能 * 修正聚合模型的`delete`方法 * 改进Model类的`useGlobalScope`方法 * Model类的日期类型支持设置为类名 * Query类增加`data`/`inc`/`dec`/`exp`方法用于快捷设置数据 `insert`和`update`方法参数可以为空 读取`data`设置数据 * 优化Connection的查询性能 * 修正Builder类的`parseOrder`方法 * 修正BelongsToMany类的`attach`方法 * BelongsToMany类的`attach`方法改进 支持批量写入 * 改进BelongsToMany类的`saveall`方法 增加第三个参数 用于指定额外参数是否一致 * Query类的`order`方法支持多次调用合并 * 改进`count`方法对`group`查询的支持 * 增加时间戳自动写入的判断 * 改进Model类`writeTransform`方法 * 改进Model的时间戳字段写入和读取 * 写入数据为对象的时候检测是否有`__toString`方法 * 改进Mysql驱动的`getFields`方法 * 改进自动时间字段的输出 * `like`查询条件支持数组 * 自动时间字段的获取自动使用时间格式化 * 改进单个字段多次Or查询情况的查询 * 修正`null`查询的条件合并 * 改进Query类`paginate`方法第一个参数可以使用数组参数 * 改进数据集对象的返回,由Query类的select方法进行数据集转换,原生查询不再支持返回数据集对象 * 增加`whereNull`、`whereIn`等一系列快捷查询方法 * `fetchPdo`方法调整 * 改进对存储过程调用的支持 改进`getRealSql`的调用机制 改进数据表字段使用中划线的参数绑定支持 * 数据库配置参数增加`result_type` 用于设置数据返回类型 方法参数名称调整 * 改进Query类的`whereTime`方法支持更多的时间日期表达式(默认查询条件为大于指定时间表达式) * 取消`min`/`max`/`sum`/`avg`方法的参数默认值 * Query类增加`getPdo`方法用于返回`PDOStatement`对象 * 改进`today`的日期表达式查询 * 改进关联属性的获取 * 改进关联定义中包含查询条件后重复执行的问题 * 改进参数绑定支持中文字段自动绑定 * 改进Builder类的`insertall`方法 增加对null和对象数据的处理 * 改进参数绑定类型 支持`bit`类型自动绑定 * Connection类`model`方法更改为`getQuery` * 优化Connection类`__call`方法 * 修正聚合模型 * 一对一关联预载入默认改为IN查询方式 * 增加`collection`助手函数用于数据集转换 * 增加`load_relation`助手函数用于数组的延迟预载入 * 改进Model类的`has`方法第二个参数支持使用数组和闭包,无需再使用`hasWhere` * `relation`方法支持嵌套关联查询 * 增加`think\model\Collection`作为模型的数据集查询集合对象 * 取消关联定义的`alias`参数(仅`morphTo`保留) * Model类的`delete`方法,支持没有主键的情况 * Model类的`allowField`方法支持逗号分割的字符串 * 改进写入数据的自动参数绑定的参数名混淆问题 * 关联预载入查询的属性名默认使用小写+下划线命名 * Query类的`with`和`relation`方法支持多次调用 * Collection类增加`hidden`、`visible`和`append`方法 * 修正软删除的强制删除方法 ### \[其它\] * `unique`验证规则支持指定完整模型类 并且默认会优先检测模型类是否存在 不存在则检测数据表 * 改进`Loader`类的`model`、`controller` 和 `validate`方法 支持直接传入类名实例化 * `Session`类增加安全选项`httponly`和`secure` * 可以允许自定义`Output`的driver,以适应命令行模式下调用其它命令行指令 * 改进`loader`类`action`的参数污染问题 * Validate类的`confirm`验证改为恒等判断 * 改进`Validate`类的错误信息处理 * 修正`Validate`类的布尔值规则验证 * 改进`cookie`助手函数对前缀的支持 * 文件缓存默认开启子目录缓存避免文件过多导致性能问题 ### \[调整\] * Connection类`model`方法更改为`getQuery` * 原生查询不再支持返回数据集对象 * 分页查询返回类型变成`think\Paginator`(用法不变) * 模型的时间日期字段会自动进行格式化输出,不需要进行额外处理。 * Session类添加了`secure`和`httponly`参数,并且默认是true ## 2016-12-20 V5.0.4 ### 主要调整: * 关联模型重构并增加多态一对多关联; * 数据库支持一个字段多次调用不同查询条件; * 增加数据库CURD事件支持; * 路由到类和控制器的方法支持传入额外参数; * 支持全局模板变量赋值; * 模型支持独立设置查询数据集对象; * 日志针对命令行及调试做出改进; * 改进Hook类的行为方法调用 ### \[请求和路由\] * 请求缓存支持模块单独开启 * Request类`post`方法支持获取`json`方式的请求数据 * 路由到类的方法和控制器方法 支持传入额外参数,用于方法的参数 * 改进控制器自动搜索的目录规范 * 改进请求缓存 * 改进自动参数绑定 * 修正路由的请求缓存设置 * 改进Route类name方法 ### \[数据库和模型\] * 增加数据库查询(CURD)事件 * 改进多表更新的字段不存在问题 * 改进Model类的`useGlobalScope`方法 * 修正子查询作为表名查询的问题 * Model类增加`resultSetType`属性 用于指定模型查询的数据集对象(默认为空返回数组) * Model类增加`toCollection`方法(自动调用) * 关联模型架构调整 * 改进预载入`with`方法的参数支持小写和下划线定义 * 修正关联多对多一处错误 * 改进关联多对多的查询 * 关联模型支持多态一对多关联 * 预载入关联查询支持关联对象属性绑定到当前模型 * 支持追加关联对象的属性到当前模型数据 * 一对一关联预载入支持JOIN和IN两种方式(默认为JOIN) * 改进多对多查询 * 改进模型更新的数据变化比较规则 * 查询支持一个字段多次查询条件 * 改进sql日志的sql语句 * 修正`join`自身表的别名覆盖问题 * 模型类的`connection`属性和数据库默认配置合并 * 改进`in`和`between`查询条件的自动参数绑定 * 改进Query类对数据集对象以及关联字段排序的支持 * 增加模型的快捷事件方法 * 改进Query类的`getTableInfo`方法缓存读取 * model类的`saveAll`方法支持调用`allowField`方法进行字段过滤 * 修正关联查询的时候 `whereTime`方法的bug * 改进Query类的聚合查询 * table方法支持字符串方式的子查询 * 修正`count` `avg`方法使用`fetchsql`无法正确返回sql的问题 ### \[其它\] * 改进命令行下的日志记录 * 部署模式下简化日志记录 * 增加debug日志类型 仅限调试模式记录 * 改进Template类`parseTemplateFile`方法 * 改进Validate类的`getRuleMsg`方法 * 控制器的`error`方法在AJAX请求默认返回url为空 * Validate类架构方法增加`field`参数 用于设置验证字段的描述 * 改进App类`invokeMethod`方法对架构函数依赖注入的支持 * 增加RedirectResponse的`restore`方法返回值 * View类增加`share`静态方法 用于静态赋值模板变量 * 验证类增加`hasScene`方法判断是否存在某个场景的验证配置 * 修正redis和session驱动的`destroy`方法返回值 * 空操作方法的参数传入去掉操作方法后缀 * 在控制器中调用request和view增加类型提示 * 改进`input`助手函数支持多维数据获取 * Cache类增加`pull`和`remember`方法 * 改进验证类的`confirm`验证规则 支持自动规则识别 * 改进验证类的错误信息定义 * 增加Validate类自定义验证错误信息的替换规则 * Cookie类增加`forever`方法用于永久保存 * 模板渲染支持从视图根目录读取模板 * 改进Hook类的exec方法 ### \[调整\] * Db类查询不再支持设置自定义数据集对象 * 废除Query类的`fetchClass`方法 * 控制器的`error`方法在AJAX请求默认返回的url为空 * 关联方法定义不支持使用小写下划线,必须使用驼峰法 * 行为类的方法必须使用驼峰法命名 ## 2016-11-11 V5.0.3 ### 主要调整: * 请求缓存增强; * 路由增强; * 数据库和模型完善; * 支持反射的异常捕获; * File类改进; * 修正社区反馈的一些BUG; ### \[ 请求和路由 \] * 资源路由自动注册的路由规则的时候会记录当前使用的资源标识; * 增强请求缓存功能和规则定义,支持全局自动缓存 * 修正控制器自动搜索的大小写问题 * 修正路由绑定到命名空间后 类的自动定位 * 改进Route类的parseRule方法 路由地址中的变量替换不自动去除路由变量 * 改进控制器自动搜索 * Route类增加setOption和getOption方法 用于记录当前路由执行过程中的参数信息 * 优化路由分组方法 * 改进分组路由的url生成 ### \[ 数据库和模型 \] * 一对一关联查询方法支持定义`field`方法 * 聚合模型支持设置`field`属性 * 改进Query类的`alias`方法 * 改进Query类`join`和`view`方法的table参数 * 改进Query类`where`方法 * 改进Query类的`paginate`方法,支持`order`方法 * 改进Query类的`min`和`max`方法支持日期类型 * 修正软删除`withTrashed`方法 * 优化Connection类的`getRealSql`方法生成的sql ### \[ 其它 \] * 增加request\_cache和request\_cache\_expire配置参数用于配置全局请求缓存; * 修正input助手函数的数组过滤 * cache助手函数支持清空操作 * 改进Config类load方法 一级配置名称强制转为小写 * 修正Url多次生成的问题 * File类修正某些环境下面无法识别上传文件的问题 * 改进App类的空操作方法调用 * 域名部署URL生成不依赖 url\_domain\_deploy 配置参数 * 修正Url类域名部署的问题 * 视图文件目录支持集中式存放 不放入模块目录 * cache助手函数支持 remember方法 * Request类的input方法或者input助手函数的`filter`参数支持传入null 表示不过滤 ## 2016-10-24 V5.0.2 ### 主要调整: * 数据库和模型完善; * 路由功能完善; * 增加`yaml`配置格式支持; * 依赖注入完善; * Session类完善; * Cookie类完善; * Validate类完善; * 支持反射类的异常捕获; * 修正社区反馈BUG; ### \[ 请求和路由 \] * 依赖注入的类如果定义了`invoke`方法则自动调用 * Request类的`header`方法增加自定义header支持 * Request类禁止直接实例化调用 * 改进Request类ip方法 * 路由变量规则支持闭包定义 * 路由参数增加`ajax`和`pjax`判断 * 别名路由增加允许和排除操作 * 改进路由域名绑定后的url生成 * 路由生成改进对路由到类的支持 * 路由生成支持`url_param_type`配置参数 * 路由生成支持别名路由 * Route重定向规则支持更多`schema` * 别名路由支持定义单独方法的请求类型 * 改进路由分组的url生成 * 路由规则的组合变量支持可选分隔符定义 * 改进路由合并参数的获取 * 路由规则支持单独设置url分隔符,路由参数为 `param_depr` * 自动搜索控制器支持自定义访问控制器层的情况 * 改进路由标识不区分大小写 * 改进路由地址是否定义过路由规则的检测 ### \[ 数据库和模型 \] * 改进Query类的join方法 * 改进Query类分页方法的参数绑定 * 修正软删除方法 * 修正Query类parseOrder方法一处错误 * 修正sqlsrv驱动parseOrder方法 * 修正Query类setInc和setDec方法 * 改进Model类的save方法支持非自增主键的处理 * 整型字段的参数绑定如果为空写入默认值0 * 改进Model类has和hasWhere方法 * 改进Query类的value方法缓存判断 * 改进Query类join方法对子查询支持 * 改进Query类的table方法和alias方法用法 * 关联预载入支持`hasOne`自关联 * 改进Builder类的parseKey方法 * 改进Builder类的join/alias/table方法的解析 * 改进全局查询范围 * 改进Query类的聚合查询方法的返回值 * 改进关联属性的读取 * 改进聚合模型主键和关联键相同的情况 * 改进模型在开启`class_suffix`参数情况下的name属性的识别 ### \[ 其它 \] * Cache类增加`remember`方法 用于当获取的缓存不存在的时候自动写入 * Session类增加`flash`方法用于设置下一次请求有效的值 * Session类增加`flush`方法用于清空当前请求有效的值 * Session类增加`push`方法用于更新数组数据 * 增加yaml配置格式支持 * 改进App类的反射异常无法捕获问题 * 修正session助手函数的清空操作 * 改进验证类的`image`方法 * 改进验证类的`activeUrl`方法 * 改进自定义验证规则的使用 * 改进控制器自动搜索后的控制器名获取 * 修正import方法加载extend目录类库 * 修正json\_encode时 "Failed calling XXX::jsonSerialize()" 的异常 * 改进Loader类model和validate方法的单例问题 * 改进方法执行的日志记录 * 改进模板引擎的Think变量解析 * 改进Lang类`load`方法 * 验证错误信息支持多语言读取 * 改进ROOT\_PATH常量 * 改进语言包加载 * 改进模板session和cookie变量获取,自动判断前缀 * 缓存驱动统一增加handler方法用于获取操作对象的句柄(某些缓存类型可能为null) * File类增加`__call`方法用于兼容5.0版本的`md5`和 `sha1`方法 * 改进文件缓存驱动的`clear`方法 * Lang类增加`setLangCookieExpire`方法设置多语言cookie过期时间 * 增加`route_complete_match`配置参数 ### \[ 调整 \] 下列模型属性和方法由原来的静态(static)定义改为动态定义: * 聚合模型的`relationModel`属性 * Model类的`useGlobalScope`属性 * 全局查询范围方法`base`改为动态方法 * 软删除属性 `deleteTime`属性 ## 2016-9-28 V5.0.1 ### 主要调整: * [依赖注入](215849undefined)完善; * [扩展配置](118027undefined)文件位置调整; * 新增数据表[字段缓存命令](211524undefined); * 支持设置当前的查询对象; * 支持[请求和路由缓存](215850undefined); ### \[ 请求和路由 \] * 改进Controller类的`success`和`error`方法的跳转地址识别 支持更多Scheme * 操作方法和架构方法支持任何对象自动注入 * Requesst类增加`getInput`方法 用于获取`php://input`值 * 路由到方法的时候 支持架构方法注入请求对象 * 改进Route类路由到类的判断 * Request增加`cache`方法,支持请求缓存 * 绑定到模块后 路由依然优先检查 * 路由增加请求缓存参数 * 修正路由组合变量的可选变量的BUG ### \[ 数据库 \] * 修正`pgsql`数据库驱动的数据表字段信息读取 * 改进Query类的`view`方法 第二个参数默认值更改为true 获取全部的字段 * 数据库配置信息增加`query`参数用于配置查询对象名称 * 型类增加`query`属性用于配置模型需要的查询对象名称 * 改进数据表字段缓存读取 * 改进数据表字段缓存生成 模型为抽象类或者 没有继承Model类 不生成字段缓存 * 改进模型的字段缓存 虚拟模型不生成字段缓存 * 改进数据表字段缓存生成 支持读取模块的模型生成 * 改进聚合模型的`save`方法 主键写入 * 模型类的field属性定义简化 取消`Query`类的`allowField`和`setFieldType`方法及相关属性 * 改进数据表字段缓存生成 支持生成多个数据库的 * 更新数据库驱动类 改进`getTables`方法 * 增加`optimize:schema` 命令 用于生成数据表字段信息缓存 * 修正一个查询条件多个条件的时候的参数绑定BUG * 分页查询方法`paginate`第二个参数传入数字表示总记录数 * 修正mysql的`JSON`字段查询 * 改进Query类的getOptions方法 当name参数不存在的时候返回null ### \[ 模型和关联 \] * 模型类的field属性不需要添加字段类型定义 * 改进Model类 添加`getDb`静态方法获取db查询对象 * 改进聚合模型`save`方法返回值 * 改进Relation类`save`方法 * 修正关联模型 多对多`save`方法一处问题 * 改进Model类的save方法 修正不按主键查询的更新问题 * 时间字段获取器获取的时候为NULL则不做转换 ### \[ 其它 \] * 改进配置缓存生成 支持扩展配置 * 取消`extra_config_list`配置参数 扩展配置文件直接放到 `extra`目录下面即可自动加载(数据库配置文件位置不变) * cache助手函数支持判断缓存是否有效 * 修正 模板引擎驱动类的`config`方法 * 修复在配置Model属性field=true情况下,通过`__call`调用db()引发的BUG * 改进模板引擎驱动的config方法 支持获取配置参数值 * 改进redirct的url地址解析 * 删除`File`类的`md5`和`sha1`方法 改为`hash`方法 支持更多的散列值类型生成 * 增加`response_end`行为标签 * 改进默认语言的加载 ## 2016-9-15 V5.0 ### \[ 请求和路由 \] * Request对象支持动态绑定属性 * 定义了路由规则的URL原地址禁止访问 * 改进路由规则存储结构 * 路由分组功能增强,支持嵌套和虚拟分组 * 路由URL高效反解 * 改进Request对象param方法获取优先级 * 路由增加name方法设置和获取路由标识 * 增加MISS和AUTO路由规则 * Route类增加auto方法 支持注册一个自动解析URL的路由 * 路由规则支持模型绑定 * 路由变量统一使用param方法获取 * 路由规则标识功能和自动标识 * 增加生成路由缓存指令 optimize:route * Request对象增加route方法单独获取路由变量 * Request对象的param get post put request delete server cookie env方法的第一个参数传入false 则表示获取原始数据 不进行过滤 * 改进自动路由标识生成 支持不同的路由规则 指向同一个路由标识,改进Url自动生成对路由标识的支持 * 改进Request类 filter属性的初始化 * 改进Request类的isAjax和isPjax方法 * Request类增加token方法 * 路由配置文件支持多个 使用 route\_config\_file 配置参数配置 * 域名绑定支持https检测 * 改进域名绑定 支持同时绑定模块和其他 支持绑定到数组定义的路由规则,取消域名绑定到分组 * 路由规则增加PATCH请求类型支持 * 增加route\_complete\_match配置参数设置全局路由规则定义是否采用完整匹配 可以由路由规则的参数complete\_match 进行覆盖 * 改进路由的 后缀参数识别 优先于系统的伪静态后缀参数 * Url类增加root方法用于指定当前root地址(不含域名) * 改进Url生成对可选参数的支持 ### \[ 数据库 \] * 查询条件自动参数绑定 * 改进分页方法支持参数绑定 * Query类的cache方法增加缓存标签参数 * Query类的update和delete方法支持调用cache方法 会自动清除指定key的缓存 配合查询方法的cache方法一起使用 * 改进Query类的延迟写入方法 * Query类的column和value方法支持fetchsql * 改进日期查询方法 * 改进存储过程方法exec的支持 * 改进Connection类的getLastInsID方法获取 * 记录数据库的连接日志(连接时间和DSN) * 改进Query类的select方法的返回结果集判断 * Connection类增加getNumRows方法 * 数据库事务方法取消返回值 * 改进Query类的chunk方法对主键的获取 * 改进当数据库驱动类型使用完整命名空间的时候 Query类的builder方法的问题 ### \[ 模型 \] * 增加软删除功能 * 关联模型和预载入改进 * 关联预载入查询闭包支持更多的连贯操作 * 完善savell方法支持更新和验证 * 关联定义统一返回Relation类 * Model类的has和hasWhere方法对join类型的支持 * Model类的data方法 批量赋值数据的时候 清空原始数据 * Model类的get方法第三个参数传入true的时候会自动更新缓存 * Model类增加只读字段支持 * Model类增加useGlobalScope方法设置是否启用全局查询范围 * Model类的base方法改为静态定义 全局多次调用有效 * Model类支持设定主键、字段信息和字段类型,不依赖自动获取,提高性能 * Model类的data方法 支持修改器 * 改进Relation类对非数字类型主键的支持 * 改进Relation类的一对多删除 * 修正Relation类的一对多关联预载入查询 ### \[ 日志和缓存 \] * 支持日志类型分离存储 * 日志允许设置记录级别 * 增加缓存标签功能 * 缓存类增加pull方法用于获取并删除 * cache助手函数增加tag参数 * 简化日志信息,隐藏数据库密码 * 增加cache/session redis驱动的库选择逻辑; * memcached驱动的配置参数支持option参数 * 调试模式下面 日志记录增加页面的header和param参数记录 * memcached缓存驱动增加连接账号密码参数 * 缓存支持设置complex类型 支持配置多种缓存并用store切换 * 缓存类增加tag方法 用于缓存标签设置 clear方法支持清除某个缓存标签的数据 * File类型日志驱动支持设置单独文件记录不同的日志级别 * 改进文件缓存和日志的存储文件名命名规范 * 缓存类增加inc和dec方法 针对数值型数据提供自增和自减操作 * Cache类增加has方法 get方法支持默认值 ### \[ 其它 \] * 视图类支持设置模板引擎参数 * 增加表单令牌生成和验证 * 增加中文验证规则 * 增加image和文件相关验证规则 * 重定向Response对象支持with方法隐含传参 * 改进Session类自动初始化 * session类增加pull方法用于获取并删除 * 增加Env类用于获取环境变量 * Request类get/post/put等更改赋值后param方法依然有效 * 改进Jump跳转地址支持Url::build 解析 * 优化Hook类 * 应用调试模式和页面trace支持环境变量设置 * config助手函数支持 config('?name') 用法 * 支持使用BIND\_MODULE常量的方式绑定模块 * 入口文件自动绑定模块功能 * 改进验证异常类的错误信息和模板输出,支持批量验证的错误信息抛出 * 完善console 增加output一些常用的方法 * 增加token助手函数 用于在页面快速显示令牌 * 增加halt方法用于变量调试并中断输出 * 改进Validate类的number验证规则 和 integer区分开 * optimize:autoload增加对extend扩展目录的扫描 * 改进Validate类的boolean验证规则 支持表单数据 * 改进cookie助手函数支持 判断是否存在某个cookie值 * 改进abort助手函数 支持抛出HttpResponseException异常 * 改进File类增加对上传错误的处理 * 改进File类move方法的返回对象增加上传表单信息,增加获取文件散列值的方法 * 改进File类的move方法的返回对象改为返回File对象实例 * 增加clear和optimize:config 指令 * 改进File类和Validate类的图像文件类型验证 * 控制器的操作方法支持注入Request之外的对象实例 * Request类 param(true) 支持获取带文件的数据 * input助手函数第一个参数增加默认值 * Validate类增加image验证规则 并改进max min length支持多种数据类型 * json输出时数据编码失败后抛出异常 ### \[ 调整 \] * 废除路由映射(静态路由)定义 * 取消url\_deny\_suffix配置 改由路由的deny\_ext参数设置 * 模型save方法返回值改为影响的记录数,取消getId参数 * Request对象controller方法返回驼峰控制器名 * 控制器前置操作方法不存在则抛出异常 * Loader类db方法增加name标识参数 * db助手函数增加第三个参数用于指定连接标识 * Sqlsrv驱动默认不对数据表字段进行小写转换 * 移除sae驱动 改为扩展包 * Oracle驱动移出核心包 * Firebird驱动移出核心包 * 取消别名定义文件alias.php * 配置参数读取的时候取消环境变量判断 需要读取环境变量的时候使用Env类 * 环境变量定义文件更改为 .env 由原来的PHP数组改为ini格式定义(支持数组方式) * 状态配置和扩展配置的加载顺序调整 便于状态配置文件中可以更改扩展配置的参数 * 取消域名绑定到路由分组功能 * 控制器类的success和error方法url参数支持传入空字符串,则不做任何处理 * 控制器的error success result redirect方法均不需要使用return * 创建目录的权限修改为0644 ## 2016-7-1 RC4版本 ### \[ 底层架构 \] * 增加Request类 并支持自动注入 * 统一Composer的自动加载机制 * 增加Response类的子类扩展 * 增加File类用于上传和文件操作 * 取消模式扩展 SAE支持降权 * 优化框架入口文件 * 改进异常机制 * App类输入/输出调整 * 单元测试的完美支持 * 增加新的控制台指令 * 取消系统路径之外的大部分常量定义 * 类库映射文件由命令行动态生成 包含应用类库 ### \[ 数据库 \] * 增加分表规则方法 * 增加日期和时间表达式查询方法 * 增加分页查询方法 * 增加视图查询方法 * 默认保持数据表字段大小写 * 数据缓存自动更新机制 * 完善事务嵌套支持 * 改进存储过程数据读取 * 支持设置数据库查询数据集返回类型 ### \[ 模型 \] * 增加Merge扩展模型 * 模型支持动态查询 * 增加更多的类型自动转换支持 * 增加全局查询范围 * toJson/toArray支持隐藏和增加属性输出 * 增加远程一对多关联 ### \[ 其它 \] * 日志存储结构调整 * Trace调试功能从日志类独立并增强 * 原Input类功能并入Request类 * 类库映射文件采用命令行生成 包含应用类库 * 验证类的check方法data数据取消引用传参 * 路由增加MISS路由规则 * 路由增加路由别名功能 ## 2016-4-23 RC3版本 ### \[ 底层架构 \] * 框架核心仓库和应用仓库分离 便于composer独立更新 * 数据库类重构,拆分为Connection(连接器)/Query(查询器)/Builder(SQL生成器) * 模型类重构,更加对象化 ### \[ 数据库 \] * 新的查询语法 * 闭包查询和闭包事务 * Query对象查询 * 数据分批处理 * 数据库SQL执行监听 ### \[ 模型 \] * 对象化操作 * 支持静态调用(查询) * 支持读取器/修改器 * 时间戳字段 * 对象/数组访问 * JSON序列化 * 事件触发 * 命名范围 * 类型自动转换 * 数据验证和完成 * 关联查询/写入 * 关联预载入 ### \[ 其它更新 \] * 路由类增加快速路由支持 * 验证Validate类重构 * Build类增加快速创建模块的方法 * Url生成类改进 * Validate类改进 * View类及模板引擎驱动设计改进 * 取消模板引擎的模板主题设计 * 修正社区反馈的一些问题 * 助手函数重新命名 * `router.php`文件位置移动 ## 2016-3-11 RC2版本 * 重新设计的自动验证和自动完成机制(原有自动验证和完成支持采用traits\\model\\Auto兼容); * 验证类Validate独立设计; * 自动生成功能交给Console完成; * 对数据表字段大小写的处理; * 改进Controller类(取消traits\\contorller\\View); * 改进Input类; * 改进Url类; * 改进Cookie类; * 优化Loader类; * 优化Route类; * 优化Template类; * Session类自动初始化; * 增加traits\\model\\Bulk模型扩展用于大批量数据写入和更新; * 缓存类和日志类增加Test驱动; * 对异常机制和错误处理的改进; * 增加URL控制器和操作是否自动转换开关; * 支持类名后缀设置; * 取消操作绑定到类的功能; * 取消use\_db\_switch参数设计; ## 2016-1-30 RC1版本 ### \[ 底层架构 \] * 真正的惰性加载 * 核心类库组件化 * 框架引导文件 * 完善的类库自动加载(支持Composer) * 采用Traits扩展 * API友好(输出、异常和调试) * 文件命名规范调整 ### \[ 调试和异常 \] * 专为API开发而设计的输出、调试和异常处理 * 日志类支持本地文件/SAE/页面Trace/SocketLog输出,可以实现远程浏览器插件调试 * 内置trace方法直接远程调试 * 异常预警通知驱动设计 * 数据库SQL性能分析支持 ### \[ 路由 \] * 动态注册路由 * 自定义路由检测方法 * 路由分组功能 * 规则路由中的变量支持采用正则规则定义(包括全局和局部) * 闭包路由 * 支持路由到多层控制器 ### \[ 控制器 \] * 控制器类无需继承controller类 * 灵活的多层控制器支持 * 可以Traits引入高级控制器功能 * rest/yar/rpc/hprose/jsonrpc控制器扩展 * 前置操作方法支持排除和指定操作 ### \[ 模型 \] * 简化的核心模型 * Traits引入高级模型/视图模型/关联模型 * 主从分布时候主数据库读操作支持 * 改进的join方法和order方法 ### \[ 视图 \] * 视图解析驱动设计(模板引擎) * 所有方法不再直接输出而是返回交由系统统一输出处理 * 动态切换模板主题设计 * 动态切换模板引擎设计 ### \[ 数据库 \] * 完全基于PDO实现 * 简化的数据库驱动设计 * SQL性能监控(需要开启数据库调试模式) * PDO参数绑定改进 ### \[ 其他方面 \] * 目录和MVC文件自动生成支持 * I函数默认添加变量修饰符为/s * 一个行为类里面支持为多个标签位定义不同的方法 * 更多的社交扩展类库
';

升级指导

最后更新于:2022-04-01 21:27:05

# 升级指导 [TOC=2,2] ## 从V5.0.23升级到V5.0.24 支持无缝升级 ## 从V5.0.22升级到V5.0.23 支持无缝升级 ## 从V5.0.21升级到V5.0.22 支持无缝升级 ## 从V5.0.20升级到V5.0.21 支持无缝升级 ## 从V5.0.19升级到V5.0.20 支持无缝升级 ## 从V5.0.18升级到V5.0.19 支持无缝升级 ## 从V5.0.17升级到V5.0.18 由于`5.0.18+`更具严谨性,如果数组查询条件中使用了`exp`查询,必须做出如下调整: ~~~ // 错误 $where['id'] = ['exp', '>score']; $model->where($where)->find(); // 正确 $where['id'] = ['exp', Db::raw('>score')]; $model->where($where)->find(); // 正确 推荐写法 $model->whereExp('id', '>score')->find(); ~~~ 如果需要使用`exp`表达式更新数据,必须使用`Db::raw()`方法或者`exp`方法。下面用法不再支持: ~~~ // 错误 不再支持 $data['score'] = ['exp', 'score+1']; $model->where('id', 1)->update($data); // 正确 $data['score'] = Db::raw('score+1'); $model->where('id', 1)->update($data); // 正确 推荐用法 $model->where('id', 1)->exp('score', 'score+1')->update(); ~~~ ## 从V5.0.16升级到V5.0.17 >[danger] 如果你使用了闭包查询条件,并且使用了默认的查询缓存`cache()`或者`cache(true)`,新版本会抛出异常,请使用`cache('key')`替代,避免因为查询缓存无效而影响业务。 > 如果你在`order`方法中使用了SQL函数,请使用`orderRaw`方法或者`Db::raw()`方法替代。 对于复杂的`field/where/order`字符串参数的,如果发现存在错误,尽量使用`fieldRaw/whereRaw/orderRaw`替代(只能传入字符串参数)。 ## 从V5.0.15升级到V5.0.16 ### 默认模板渲染规则改进 由于`fetch`方法和`view`函数的默认模板规则调整为操作方法的名称(不含操作后缀)转换为小写+下划线方式,而不是原来的直接把操作名称转小写。 举个例子,你的控制器操作方法名如果是`helloWorld`,之前版本使用: ~~~ $this->fetch(); // 或者 view(); ~~~ 渲染输出的时候会定位到 `helloworld.html`模板文件,而新版会自动定位到`hello_world.html`模板文件。 > 对于指定模板渲染的`fetch`方法和`view`助手函数不受影响,对于非驼峰操作方法名也没有影响。 ## 从V5.0.14升级到V5.0.15 `V5.0.14`可以无缝升级到`V5.0.15`。 ## 从V5.0.13升级到V5.0.14 `V5.0.13`可以无缝升级到`V5.0.14`。 ## 从V5.0.12升级到V5.0.13 `V5.0.12`可以无缝升级到`V5.0.13`,如果使用了Redis缓存,需要清空下Redis缓存数据的内容。 ## 从V5.0.11升级到V5.0.12 `V5.0.11`可以无缝升级到`V5.0.12`。 ## 从V5.0.10升级到V5.0.11 `V5.0.10`可以无缝升级到`V5.0.11`。 >[danger] 升级完成后请务必清空下数据缓存。 ## 从V5.0.9升级到V5.0.10 `V5.0.9`可以无缝升级到`V5.0.10`。 ## 从V5.0.8升级到V5.0.9 `V5.0.8`可以无缝升级到`V5.0.9`。 ## 从V5.0.7升级到V5.0.8 如果自定义了应用的命名空间的话,原来的`app_namespace`配置参数改为`APP_NAMESPACE`常量在入口文件中定义 如果使用了多对多关联,并且定义了中间表,那么中间表改为去掉前缀后的数据表名。 模型的scope方法之后只能使用数据库查询方法而不能使用模型的方法。 ## 从V5.0.6升级到V5.0.7 `V5.0.6`可以无缝升级到`V5.0.7`。 ## 从V5.0.5升级到V5.0.6 `V5.0.5`可以无缝升级到`V5.0.6`。 由于数据库缓存策略的改进,之前如果使用了数据缓存,请先清空下数据缓存。 之前因为升级到5.0.5版本后 时间字段使用整型后也会自动格式化输出的问题,现在可以设置数据库的配置参数 `datetime_format`值为`false`即可关闭自动转换。 另外,注意,如果使用了`MongoDb`数据库扩展的话,请删除数据库配置文件中的`query`参数。 ## 从V5.0.4升级到V5.0.5 从`V5.0.4`升级到`V5.0.5`需要注意如下事项: 模型的时间日期字段会自动进行格式化输出,不需要进行额外处理。 原生查询不再支持返回数据集对象。 `Connection`类的`model`方法已经更改为`getQuery`。 关联定义方法的`alias`参数已经废弃。 分页查询返回类型变成`think\Paginator`(用法不变)。 数据缓存自动采用子目录方式避免缓存数据文件过多影响性能。 Session类添加了`secure`和`httponly`参数,并且默认是true,如果不支持请手动关闭。 ## 从V5.0.3升级到V5.0.4 从`V5.0.3`升级到`V5.0.4`需要注意如下事项: 模型的关联定义方法必须采用驼峰法(小写字母打头)命名规范,但关联调用可以支持驼峰和小写方式。 行为类的方法必须使用驼峰法命名,如果你使用了钩子位作为行为执行方法入口,请修改为驼峰法,例如 `app_init`钩子位对应的行为方法名应该是 `appInit`。 如果你使用了Query类的`fetchClass`方法自定义数据集返回对象的话,请改为在模型中设置`resultSetType`属性,数据库类不再支持自定义查询数据集对象(只支持数组和系统的`think\Collection`数据集对象) ## 从V5.0.2升级到V5.0.3 从`V5.0.2`升级到`V5.0.3`需要注意如下事项: 对于join方法和view方法使用子查询的情况,请尽量使用数组方式: >[info] ['子查询'=>'别名'] ## 从V5.0.1升级到V5.0.2 从`V5.0.1`升级到`V5.0.2`需要注意如下事项: 下列模型属性和方法由原来的静态(static)定义改为动态定义: * 聚合模型的`relationModel`属性 * Model类的`useGlobalScope` 属性 * 软删除属性 `deleteTime`属性 * 全局查询范围方法`base`改为动态方法 原来的`join`方法和`view`方法的第一个参数规范化,支持下面三种用法: >[info]#### 用法一:[ '带前缀表名'=>'别名' ] >#### 用法二:'带前缀表名 别名' >#### 用法三:'不带前缀的表名' 如果有其它用法注意调整,下面的用法不再支持: >[info] #### '不带前缀表名 别名' 如果使用了空操作方法,无需给`_empty`方法添加任何参数,当前操作名的获取直接使用请求对象的`action`函数获取。 ## 从V5.0升级到V5.0.1 从`V5.0`升级到`V5.0.1`需要注意如下事项: * 扩展配置参数`extra_config_list`废弃,除了数据库配置之外的扩展配置放入`application/extra`目录自动识别加载。 * 模型的`field`属性无需配置字段类型 * 查询构建器使用手动参数绑定的时候不要使用`?`号占位绑定,使用命名参数绑定 * 如果使用了`file_get_contents('php://input')`请改为`Request`对象的`getInput()` 方法获取 * 文件`File`类取消`md5()`和`sha1()`方法,请使用`hash('md5')`和`hash('sha1')`方法替代 ## 从V5.0RC4升级到V5.0 可以轻松的从RC4版本升级到正式版,不过请注意如下事项: * 如果定义了路由映射(静态路由)的则改为普通路由规则定义 * 定义了路由规则之后,原来的URL地址被禁止访问,请注意检查是否还有这种情况 * 如果配置了url_deny_suffix参数,改为路由的deny_ext参数设置 * 模型save方法返回值改为影响的记录数,并且方法参数中取消了getId参数 * Request对象controller方法返回驼峰控制器名,如果使用该方法渲染模板的话,请使用Loader::parseName(Request::instance()->controller())转换 * 如果使用了Sqlsrv驱动则,原来自动转换小写数据表字段默认不对数据表字段进行小写转换,请更改PDO::ATTR_CASE参数 * 如果部署在sae 需要使用sae扩展包 * 如果使用了Sqlsrv/Orace/Firebird驱动,则自行添加原来的驱动文件 * 配置参数读取的时候取消环境变量判断,需要读取环境变量的时候改用Env类 * 环境变量定义文件更改为 .env 由原来的PHP数组改为ini格式定义(支持数组方式) * 状态配置和扩展配置的加载顺序调整 便于状态配置文件中可以更改扩展配置的参数 * 取消域名绑定到路由分组功能 * 控制器类的success和error方法url参数支持传入空字符串,则不做任何处理 >[danger]### 关键几点: > 默认模板目录全部是小写+下滑线规范; > 控制器类的success、error和redirect方法无需使用return; > 模型的save方法返回值更改为影响的记录数,而非主键,使用model->id方式获取主键; > 路由定义后不能再使用原来URL地址访问; ## 从V3.2版本升级到V5.0 3.2版本无法直接升级到5.0版本,这里只是给出了升级指导思想和为了使用`3.X`版本的开发者更快的熟悉并上手这个全新的版本。同时也强烈建议开发者抛弃之前旧的思维模式,因为`5.0`是一个全新的颠覆重构版本。 ### 需要摒弃的3.X旧思想 ### URL的变动 首先对3.X的不严谨给开发者们带来的不正确的引导表示歉意,在5.0版本正式废除类似/id/1方式 可以通过get获取到id的方法,严格来讲这样的url是不属于$_GET的,现在可以通过param获取,具体使用可以通过请求部分查询。 ### 模型的变动 新版的模型查询返回默认对象,系统默认增加了toArray方法,许多开发者在all或select尝试使用toArray来转换为数组,在此希望开发者能理解对象的概念,尝试使用对象进行数据的使用,或者使用db方法进行数据库的操作,也提醒一下部分滥用toArray的开发者,all或select结果是对象的数组集合,是无法使用toArray进行转换的。 ### 新版变化 ### 命名规范 * 目录和文件名采用‘小写+下划线’,并且以小写字母开头; * 类库、函数文件统一以.php为后缀; * 类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致(包括大小写); * 类名和类文件名保持一致,并统一采用驼峰法命名(首字母大写) ### 函数 * 系统已经不依赖任何函数,只是对常用的操作封装提供了助手函数; * 单字母函数废弃,默认系统加载助手函数,具体参考上一个章节‘助手函数’; ### 路由 5.0的URL访问不再支持普通URL模式,路由也不支持正则路由定义,而是全部改为规则路由配合变量规则(正则定义)的方式,具体这里不再赘述。 ### 控制器 控制器的命名空间有所调整,并且可以无需继承任何的控制器类。 * 应用类库的命名空间统一为app(可修改)而不是模块名; * 控制器的类名默认不带`Controller`后缀,可以配置开启`controller_suffix`参数启用控制器类后缀; * 控制器操作方法采用`return`方式返回数据,而非直接输出; * 废除原来的操作前后置方法; ### 版本对比 3.2版本控制器写法 ~~~ fetch('index/hello'); ~~~ 如果你的控制器没有继承 `think\Controller`的话,使用: ~~~ return view('index/hello'); ~~~ ### 模型 如果非要对比与旧版本的改进,模型被分为数据库、模型、验证器三部分,分别对应M方法、模型、自动验证,同时均有所加强,下面做简单介绍。 ### 数据库 5.0的数据库查询功能增强,原先需要通过模型才能使用的链式查询可以直接通过Db类调用,原来的M函数调用可以改用db函数,例如: 3.2版本 ~~~ M('User')->where(['name'=>'thinkphp'])->find(); ~~~ 5.0版本 ~~~ db('User')->where('name','thinkphp')->find(); ~~~ ### 模型 新版的模型查询增加了静态方法,例如: ~~~ User::get(1); User::all(); User::where('id','>',10)->find(); ~~~ 模型部分增强了很多功能,具体请查阅“模型章节”。 ### 自动验证 对比旧的版本,可以理解为之前的自动验证且不同于之前的验证; ThinkPHP5.0验证使用独立的`\think\Validate`类或者**验证器**进行验证,不仅适用于模型,在控制器也可直接调用,具体使用规则请参考“验证”章节,这里不再赘述。 ### 配置文件 新版对配置很多的配置参数或者配置层次都和之前不同了,建议大家要么看看代码,要么仔细通读下官方的开发手册,不要因为配置的问题浪费自己一整天的时间。 ### 异常 5.0对错误零容忍,默认情况下会对任何级别的错误抛出异常,并且重新设计了异常页面,展示了详尽的错误信息,便于调试。 ### 系统常量的废弃 5.0版本相对于之前版本对系统变化进行了大量的废弃,用户如果有相关需求可以自行定义 下面是废除常量 ~~~ REQUEST_METHOD IS_GET IS_POST IS_PUT IS_DELETE IS_AJAX __EXT__ COMMON_MODULE MODULE_NAME CONTROLLER_NAME ACTION_NAME APP_NAMESPACE APP_DEBUG MODULE_PATH等 ~~~ 部分常量可以在Request里面进行获取,具体参考“请求章节”。 > 再次说明本章节仅仅为之前使用3.X版本开发者快速理解5.0所写,具体5.0的功能还需要开发者通读手册。 ### 助手函数 `5.0`助手函数和`3.2`版本的单字母函数对比如下: |`3.2`版本|`5.0`版本| |---|---| |C|config| |E|exception| |G|debug| |L|lang| |T|废除| |I|input| |N|废除| |D|model| |M|db| |A|controller| |R|action| |B|废除| |U|url| |W|widget| |S|cache| |F|废除|
';

助手函数

最后更新于:2022-04-01 21:27:03

# 助手函数 系统为一些常用的操作方法封装了助手函数,便于使用,包含如下: |助手函数|描述| |---|---| |abort|中断执行并发送HTTP状态码| |action|调用控制器类的操作| |cache|缓存管理| |config|获取和设置配置参数| |controller|实例化控制器| |cookie|Cookie管理| |db|实例化数据库类| |debug|调试时间和内存占用| |dump|浏览器友好的变量输出| |exception | 抛出异常处理| |halt|变量调试输出并中断执行| |import|导入所需的类库 | |input|获取输入数据 支持默认值和过滤| |json|JSON数据输出| |jsonp|JSONP数据输出| |lang|获取语言变量值| |load_trait |快速导入Traits `PHP5.5`以上无需调用| |model|实例化Model| |redirect|重定向输出| |request|实例化Request对象| |response|实例化Response对象| |session|Session管理| |trace|记录日志信息| |token|生成表单令牌输出| |url|Url生成| |validate|实例化验证器| |vendor|快速导入第三方框架类库| |view|渲染模板输出| |widget|渲染输出Widget| |xml|XML数据输出| 核心框架不依赖任何助手函数,系统只是默认加载了助手函数,配置如下: ~~~ // 扩展函数文件定义 'extra_file_list' => [THINK_PATH . 'helper' . EXT], ~~~ 因此,你可以随意修改助手函数的名称或者添加自己的助手函数,然后修改配置为: ~~~ // 扩展函数文件定义 'extra_file_list' => [APP_PATH . 'helper' . EXT], ~~~ ~~~ // 使用扩展函数文件 'extra_file_list' => [ THINK_PATH . 'helper' . EXT, APP_PATH . 'helper' . EXT ], ~~~
';

常量参考

最后更新于:2022-04-01 21:27:00

## 预定义常量 预定义常量是指系统内置定义好的常量,不会随着环境的变化而变化,包括: ~~~ EXT 类库文件后缀(.php) THINK_VERSION 框架版本号 ~~~ ## 路径常量 系统和应用的路径常量用于系统默认的目录规范,可以通过重新定义改变,如果不希望定制目录,这些常量一般不需要更改。 ~~~ DS 当前系统的目录分隔符 THINK_PATH 框架系统目录 ROOT_PATH 框架应用根目录 APP_PATH 应用目录(默认为application) CONF_PATH 配置目录(默认为APP_PATH) LIB_PATH 系统类库目录(默认为 THINK_PATH.'library/') CORE_PATH 系统核心类库目录 (默认为 LIB_PATH.'think/') TRAIT_PATH 系统trait目录(默认为 LIB_PATH.'traits/') EXTEND_PATH 扩展类库目录(默认为 ROOT_PATH . 'extend/') VENDOR_PATH 第三方类库目录(默认为 ROOT_PATH . 'vendor/') RUNTIME_PATH 应用运行时目录(默认为 ROOT_PATH.'runtime/') LOG_PATH 应用日志目录 (默认为 RUNTIME_PATH.'log/') CACHE_PATH 项目模板缓存目录(默认为 RUNTIME_PATH.'cache/') TEMP_PATH 应用缓存目录(默认为 RUNTIME_PATH.'temp/') ~~~ ## 系统常量 系统常量会随着开发环境的改变或者设置的改变而产生变化。 ~~~ IS_WIN 是否属于Windows 环境 IS_CLI 是否属于命令行模式 THINK_START_TIME 开始运行时间(时间戳) THINK_START_MEM 开始运行时候的内存占用 ENV_PREFIX 环境变量配置前缀 ~~~
';

配置参考

最后更新于:2022-04-01 21:26:58

## 惯例配置 ### 应用设置 ~~~ // 应用调试模式 'app_debug' => true, // 应用模式状态 'app_status' => '', // 应用Trace 'app_trace' => false, // 是否支持多模块 'app_multi_module' => true, // 注册的根命名空间 'root_namespace' => [], // 扩展配置文件 (V5.0.1 已经废弃) 'extra_config_list' => ['database', 'route', 'validate'], // 扩展函数文件 'extra_file_list' => [THINK_PATH . 'helper' . EXT], // 默认输出类型 'default_return_type' => 'html', // 默认AJAX 数据返回格式,可选json xml ... 'default_ajax_return' => 'json', // 默认JSONP格式返回的处理方法 'default_jsonp_handler' => 'jsonpReturn', // 默认JSONP处理方法 'var_jsonp_handler' => 'callback', // 默认时区 'default_timezone' => 'PRC', // 是否开启多语言 'lang_switch_on' => false, // 默认全局过滤方法 用逗号分隔多个 'default_filter' => '', // 默认语言 'default_lang' => 'zh-cn', // 应用类库后缀 'class_suffix' => false, // 控制器类后缀 'controller_suffix' => false, ~~~ ### 模块设置 ~~~ // 默认模块名 'default_module' => 'index', // 禁止访问模块 'deny_module_list' => ['common'], // 默认控制器名 'default_controller' => 'Index', // 默认操作名 'default_action' => 'index', // 默认验证器 'default_validate' => '', // 默认的空控制器名 'empty_controller' => 'Error', // 操作方法后缀 'action_suffix' => '', // 自动搜索控制器 'controller_auto_search' => false, ~~~ ### URL设置 ~~~ // PATHINFO变量名 用于兼容模式 'var_pathinfo' => 's', // 兼容PATH_INFO获取 'pathinfo_fetch' => ['ORIG_PATH_INFO', 'REDIRECT_PATH_INFO', 'REDIRECT_URL'], // pathinfo分隔符 'pathinfo_depr' => '/', // URL伪静态后缀 'url_html_suffix' => 'html', // URL普通方式参数 用于自动生成 'url_common_param' => false, // URL参数方式 0 按名称成对解析 1 按顺序解析 'url_param_type' => 0, // 是否开启路由 'url_route_on' => true, // 是否强制使用路由 'url_route_must' => false, // 域名部署 'url_domain_deploy' => false, // 域名根,如thinkphp.cn 'url_domain_root' => '', // 是否自动转换URL中的控制器和操作名 'url_convert' => true, // 默认的访问控制器层 'url_controller_layer' => 'controller', // 表单请求类型伪装变量 'var_method' => '_method', // 表单ajax伪装变量 V5.0.2+ 'var_ajax' => '_ajax', // 表单pjax伪装变量 V5.0.2+ 'var_pjax' => '_pjax', // 是否开启请求缓存 true自动缓存 支持设置请求缓存规则 V5.0.3+ 'request_cache' => false, // 请求缓存有效期 V5.0.3+ 'request_cache_expire' => null, ~~~ ### 模板引擎设置 ~~~ 'template' => [ // 模板引擎类型 支持 php think 支持扩展 'type' => 'Think', // 模板路径 'view_path' => '', // 模板后缀 'view_suffix' => 'html', // 模板文件名分隔符 'view_depr' => DS, // 模板引擎普通标签开始标记 'tpl_begin' => '{', // 模板引擎普通标签结束标记 'tpl_end' => '}', // 标签库标签开始标记 'taglib_begin' => '{', // 标签库标签结束标记 'taglib_end' => '}', ], // 视图输出字符串内容替换 'view_replace_str' => [], // 默认跳转页面对应的模板文件 'dispatch_success_tmpl' => THINK_PATH . 'tpl' . DS . 'dispatch_jump.tpl', 'dispatch_error_tmpl' => THINK_PATH . 'tpl' . DS . 'dispatch_jump.tpl', ~~~ ### 异常及错误设置 ~~~ // 异常页面的模板文件 'exception_tmpl' => THINK_PATH . 'tpl' . DS . 'think_exception.tpl', // 错误显示信息,非调试模式有效 'error_message' => '页面错误!请稍后再试~', // 显示错误信息 'show_error_msg' => false, ~~~ ### 日志设置 ~~~ 'log' => [ // 日志记录方式,支持 file socket 'type' => 'File', // 日志保存目录 'path' => LOG_PATH, ], ~~~ ### Trace设置 ~~~ 'trace' => [ // 内置Html Console 支持扩展 'type' => 'Html', ], ~~~ ### 缓存设置 ~~~ 'cache' => [ // 驱动方式 'type' => 'File', // 缓存保存目录 'path' => CACHE_PATH, // 缓存前缀 'prefix' => '', // 缓存有效期 0表示永久缓存 'expire' => 0, ], ~~~ ### 会话设置 ~~~ 'session' => [ 'id' => '', // SESSION_ID的提交变量,解决flash上传跨域 'var_session_id' => '', // SESSION 前缀 'prefix' => 'think', // 驱动方式 支持redis memcache memcached 'type' => '', // 是否自动开启 SESSION 'auto_start' => true, ], ~~~ ### Cookie设置 ~~~ 'cookie' => [ // cookie 名称前缀 'prefix' => '', // cookie 保存时间 'expire' => 0, // cookie 保存路径 'path' => '/', // cookie 有效域名 'domain' => '', // cookie 启用安全传输 'secure' => false, // httponly设置 'httponly' => '', // 是否使用 setcookie 'setcookie' => true, ], ~~~ ### 数据库设置 ~~~ 'database' => [ // 数据库类型 'type' => 'mysql', // 数据库连接DSN配置 'dsn' => '', // 服务器地址 'hostname' => 'localhost', // 数据库名 'database' => '', // 数据库用户名 'username' => 'root', // 数据库密码 'password' => '', // 数据库连接端口 'hostport' => '', // 数据库连接参数 'params' => [], // 数据库编码默认采用utf8 'charset' => 'utf8', // 数据库表前缀 'prefix' => '', // 数据库调试模式 'debug' => false, // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) 'deploy' => 0, // 数据库读写是否分离 主从式有效 'rw_separate' => false, // 读写分离后 主服务器数量 'master_num' => 1, // 指定从服务器序号 'slave_no' => '', // 是否严格检查字段是否存在 'fields_strict' => true, // 数据集返回类型 'resultset_type' => 'array', // 自动写入时间戳字段 'auto_timestamp' => false, // 是否需要进行SQL性能分析 'sql_explain' => false, ], ~~~ ### 分页配置 ~~~ 'paginate' => [ 'type' => 'bootstrap', 'var_page' => 'page', 'list_rows' => 15, ], ~~~
';

附录

最后更新于:2022-04-01 21:26:56

[配置参考](%E9%85%8D%E7%BD%AE%E5%8F%82%E8%80%83.md) [常量参考](%E5%B8%B8%E9%87%8F%E5%8F%82%E8%80%83.md) [助手函数](%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)
';

URL重写

最后更新于:2022-04-01 21:26:54

可以通过URL重写隐藏应用的入口文件`index.php`,下面是相关服务器的配置参考: ## [ Apache ] 1. httpd.conf配置文件中加载了mod_rewrite.so模块 1. AllowOverride None 将None改为 All 1. 把下面的内容保存为.htaccess文件放到应用入口文件的同级目录下 ~~~ Options +FollowSymlinks -Multiviews RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L] ~~~ ## [ IIS ] 如果你的服务器环境支持ISAPI_Rewrite的话,可以配置httpd.ini文件,添加下面的内容: ~~~ RewriteRule (.*)$ /index\.php\?s=$1 [I] ~~~ 在IIS的高版本下面可以配置web.Config,在中间添加rewrite节点: ~~~ ~~~ ## [ Nginx ] 在Nginx低版本中,是不支持PATHINFO的,但是可以通过在Nginx.conf中配置转发规则实现: ~~~ location / { // …..省略部分代码 if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=/$1 last; break; } } ~~~ > 其实内部是转发到了ThinkPHP提供的兼容URL,利用这种方式,可以解决其他不支持PATHINFO的WEB服务器环境。 如果你的应用安装在二级目录,`Nginx`的伪静态方法设置如下,其中`youdomain`是所在的目录名称。 ~~~ location /youdomain/ { if (!-e $request_filename){ rewrite ^/youdomain/(.*)$ /youdomain/index.php?s=/$1 last; } } ~~~ 原来的访问URL: ~~~ http://serverName/index.php/模块/控制器/操作/[参数名/参数值...] ~~~ 设置后,我们可以采用下面的方式访问: ~~~ http://serverName/模块/控制器/操作/[参数名/参数值...] ~~~ 如果你没有修改服务器的权限,可以在index.php入口文件做修改,这不是正确的做法,并且不一定成功,视服务器而定,只是在框架执行前补全$_SERVER['PATH_INFO']参数 ~~~ $_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI' ]; ~~~
';

Linux 主机环境

最后更新于:2022-04-01 21:26:51

> 部分 Linux 主机设置了 open_basedir(可将用户访问文件的活动范围限制在指定的区域,通常是入口文件根目录的路径) 选项,导致 ThinkPHP5 访问白屏或者报错 如果把`ThinkPHP5`部署在了`LAMP/LNMP`环境上很有可能出现白屏的情况,这个时候需要开启 php 错误提示来判断是否是因为设置了`open_basedir`选项出错。 打开 php.ini 搜索 `display_errors`,把 Off 修改为 On就开启了 php 错误提示,这时再访问之前白屏的页面就会出现错误信息。如果错误信息如下那么很有可能就是因为`open_basedir`的问题。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-21_56ef62f0cde5a.jpg) ## php.ini 修改方法 把权限作用域由入口文件目录修改为框架根目录 打开 php.ini 搜索 `open_basedir`,把 ~~~ open_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/" ~~~ 修改为 ~~~ open_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/" ~~~ 如果你的 `php.ini` 文件的 `open_basedir` 设置选项是被注释的或者为 none,那么你需要通过 Apache 或者 Nginx 来修改 > php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于你 LAMP 环境配置 ## Apache 修改方法 Apache 需要修改 `httpd.conf` 或者同目录下的 `vhost` 目录下 `你的域名.conf` 文件,如果你的生成环境是 LAMP 一键安装包配置那么多半就是直接修改 `你的域名.conf` 文件 ~~~ apache ├─vhost ├─www.thinkphp.cn.conf ├─...... ├─httpd.conf ~~~ 打开 你的域名.conf 文件 搜索 `open_basedir`,把 ~~~ php_admin_value open_basedir "/home/wwwroot/www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/" ~~~ 修改为 ~~~ php_admin_value open_basedir "/home/wwwroot/www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/" ~~~ 然后重新启动 `apache` 即可生效 > 域名.conf 文件通常是在 /usr/local/apache/conf 目录中,当然了这取决于你 LAMP 环境配置 ## Nginx/Tengine 修改方法 `Nginx` 需要修改 `nginx.conf` 或者 `conf/vhost` 目录下 你的域名.conf 文件,如果你的生成环境是 LNMP/LTMP 一键安装包配置那么多半就是直接修改 你的域名.conf 文件 ~~~ nginx ├─conf ├─vhost ├─www.thinkphp.cn.conf ├─nginx.conf ├─...... ├─nginx.conf ~~~ 打开 你的域名.conf 文件 搜索 `open_basedir`,把 ~~~ fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/www.thinkphp.cn/public/:/tmp/:/proc/"; ~~~ 修改为 ~~~ fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/www.thinkphp.cn/:/tmp/:/proc/"; ~~~ 然后重新启动 Nginx 即可生效 > 域名.conf 文件通常是在 /usr/local/nginx/conf/vhost 目录中,当然了这取决于你 LNMP/LTMP 环境配置 ## fpm/fastcgi user.ini 修改方法 打开 项目根目录下找到 user.ini 文件,搜索 `open_basedir`,把 ~~~ open_basedir=/home/wwwroot/www.thinkphp.cn/public/:/tmp/:/proc/ ~~~ 修改为 ~~~ open_basedir=/home/wwwroot/www.thinkphp.cn/:/tmp/:/proc/ ~~~ 然后重新启动 `web 服务器` 即可生效 ## 修改 ThinkPHP5 入口文件 直接修改 ThinkPHP5 的入口文件会把你的框架文件及程序目录暴露在外网,敬请注意安全防护。 修改入口文件方法请参考([**部署-虚拟主机环境**](129746))
';

虚拟主机环境

最后更新于:2022-04-01 21:26:49

ThinkPHP 支持各种各样的线上生产环境,如果你的生产环境与开发环境不符,需要稍作调整 ThinkPHP 的配置,以适应线上生产环境 ## 修改入口文件 5.0默认的应用入口文件位于`public/index.php`,内容如下: ~~~ // 定义应用目录 define('APP_PATH', __DIR__ . '/../application/'); // 加载框架引导文件 require __DIR__ . '/../thinkphp/start.php'; ~~~ >[info] 入口文件位置的设计是为了让应用部署更安全,public目录为web可访问目录,其他的文件都可以放到非WEB访问目录下面。 我们也可以改变入口文件的位置及内容,例如把入口文件改到根目录下面改成: ~~~ // 应用目录 define('APP_PATH', __DIR__.'/apps/'); // 加载框架引导文件 require './thinkphp/start.php'; ~~~ > 注意:APP_PATH的定义支持相对路径和绝对路径,但必须以“/”结束 如果你调整了框架核心目录的位置或者目录名,只需要这样修改: ~~~ // 改变应用目录的名称 define('APP_PATH', __DIR__.'/apps/'); // 加载框架引导文件 require './think/start.php'; ~~~ 这样最终的应用目录结构如下: ~~~ www WEB部署目录(或者子目录) ├─index.php 应用入口文件 ├─apps 应用目录 └─think 框架目录 ~~~
';

部署

最后更新于:2022-04-01 21:26:47

[虚拟主机环境](%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA%E7%8E%AF%E5%A2%83.md) [Linux 主机环境](Linux%20%E4%B8%BB%E6%9C%BA%E7%8E%AF%E5%A2%83.md) [URL重写](URL.md)
';

自定义命令行

最后更新于:2022-04-01 21:26:44

## 创建自定义命令行 第一步,配置command.php文件,目录在application/command.php ~~~ setName('test')->setDescription('Here is the remark ');     }     protected function execute(Input $input, Output $output)     {         $output->writeln("TestCommand:");     } } ~~~ 这个文件定义了一个叫test的命令,备注为Here is the remark, 执行命令会输出TestCommand。 第三步,测试-命令帮助-命令行下运行 ~~~ php think ~~~ 输出 ~~~ 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   help               Displays help for a command   list               Lists commands   test               Here is the remark  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:route     Build route cache.   optimize:schema    Build database schema cache. ~~~ 第四步,运行test命令 ~~~ php think test ~~~ 输出 ~~~ TestCommand: ~~~
';

生成数据表字段缓存

最后更新于:2022-04-01 21:26:42

## 生成数据表字段缓存`optimize:schema` >[success]#### 版本要求`V5.0.1` 可以通过生成数据表字段信息缓存,提升数据库查询的性能,避免多余的查询。命令如下: ~~~ php think optimize:schema ~~~ 会自动生成当前数据库配置文件中定义的数据表字段缓存,也可以指定数据库生成字段缓存(必须有用户权限),例如,下面指定生成demo数据库下面的所有数据表的字段缓存信息。 ~~~ php think optimize:schema --db demo ~~~ 执行后会自动在`runtime/schema`目录下面按照数据表生成字段缓存文件。 如果你的应用使用了不同的数据库连接,可以根据模块来生成,如下: ~~~ php think optimize:schema --module index ~~~ 会读取index模块的模型来生成数据表字段缓存。 >[danger] 没有继承think\Model类的模型和抽象类不会生成。 更新数据表字段缓存也是同样的方式,每次执行都会重新生成缓存。如果需要单独更新某个数据表的缓存,可以使用: ~~~ php think optimize:schema --table think_user ~~~ 支持指定数据库名称 ~~~ php think optimize:schema --table demo.think_user ~~~
';

生成配置缓存文件

最后更新于:2022-04-01 21:26:40

## 生成配置缓存`optimize:config` 可以为应用或者模块生成配置缓存文件 ~~~ php think optimize:config ~~~ 默认生成应用的配置缓存文件,调用后会在`runtime`目录下面生成`init.php`文件,生成配置缓存文件后,应用目录下面的`config.php` `common.php`以及`tags.php`不会被加载,被`runtime/init.php`取代。 如果需要生成某个模块的配置缓存,可以使用: ~~~ php think optimize:config index ~~~ 调用后会在`runtime/index`目录下面生成`init.php`文件,生成后,`index`模块目录下面的`config.php` `common.php`以及`tags.php`不会被加载,被`runtime/index/init.php`取代。
';

清除缓存文件

最后更新于:2022-04-01 21:26:37

## 清除缓存文件`clear` 如果需要清除应用的缓存文件,可以使用下面的命令: ~~~ php think clear ~~~ 不带任何参数调用clear命令的话,会清除`runtime`目录(包括模板缓存、日志文件及其子目录)下面的所有的文件,但会保留目录。 如果需要清除某个指定目录下面的文件,可以使用: ~~~ php think clear --path d:\www\tp5\runtime\log\ ~~~
';

生成路由缓存

最后更新于:2022-04-01 21:26:35

## 生成路由缓存`optimize:route` 如果你的应用定义了比较多的路由规则,可以使用下面的指令生成路由缓存文件,提高系统的路由检测的性能。 ~~~ >php think optimize:route ~~~ 指令执行成功后,会在`runtime`目录下面生成`route.php`文件,生成的路由缓存文件仅仅支持在应用的路由配置文件中定义的路由(包括方法定义和配置定义)。
';

生成类库映射文件

最后更新于:2022-04-01 21:26:33

## 生成类库映射文件`optimize:autoload` 可以使用下面的指令生成类库映射文件,提高系统自动加载的性能。 ~~~ >php think optimize:autoload ~~~ 指令执行成功后,会在runtime目录下面生成`classmap.php`文件,生成的类库映射文件会扫描系统目录和应用目录的类库。
';

创建类库文件

最后更新于:2022-04-01 21:26:31

## 快速生成控制器类 执行下面的指令可以生成`index`模块的`Blog`控制器类库文件 ~~~ >php think make:controller index/Blog ~~~ 生成的控制器类文件如下: ~~~ php think make:controller index\Blog --plain ~~~ ## 快速生成模型类 执行下面的指令可以生成`index`模块的`Blog`模型类库文件 ~~~ >php think make:model index/Blog ~~~ 生成的模型类文件如下: ~~~ namespace app\index\model; use think\Model; class Blog extends Model { } ~~~
';

自动生成目录结构

最后更新于:2022-04-01 21:26:28

ThinkPHP5.0 具备自动创建功能,可以用来自动生成需要的模块及目录结构和文件等,自动生成主要调用`\think\Build`类库。 ## 生成规则定义 首先需要定义一个用于自动生成的规则定义文件,通常命名为`build.php`。 默认的框架的根目录下面自带了一个`build.php`示例参考文件,内容如下: ~~~ return [ // 生成运行时目录 '__file__' => ['common.php'], // 定义index模块的自动生成 'index' => [ '__file__' => ['common.php'], '__dir__' => ['behavior', 'controller', 'model', 'view'], 'controller' => ['Index', 'Test', 'UserType'], 'model' => [], 'view' => ['index/index'], ], // 。。。 其他更多的模块定义 ]; ~~~ 可以给每个模块定义需要自动生成的文件和目录,以及MVC类。 * `__dir__` 表示生成目录(支持多级目录) * `__file__` 表示生成文件(不定义默认会生成 config.php 文件) * controller 表示生成controller类 * model表示生成model类 * view表示生成html文件(支持子目录) 自动生成以`APP_PATH`为起始目录,`__dir__` 和 `__file__` 表示需要自动创建目录和文件,其他的则表示为模块自动生成。 模块的自动生成则以 `APP_PATH.'模块名/'` 为起始目录。 并且会自动生成模块的默认的Index访问控制器文件用于显示框架的欢迎页面。 我们还可以在`APP_PATH`目录下面自动生成其它的文件和目录,或者增加多个模块的自动生成,例如: ~~~ return [ '__file__' => ['hello.php','test.php'], // 定义index模块的自动生成 'index' => [ '__file__' => ['tags.php', 'user.php', 'hello.php'], '__dir__' => ['behavior', 'controller', 'model', 'view'], 'controller' => ['Index', 'Test', 'UserType'], 'model' => [], 'view' => ['index/index'], ], // 定义test模块的自动生成 'test'=>[ '__dir__' => ['behavior','controller','model','widget'], 'controller'=> ['Index','Test','UserType'], 'model' => ['User','UserType'], 'view' => ['index/index','index/test'], ], ]; ~~~ ## 命令行自动生成 我们通过控制台来完成自动生成,切换到命令行,在应用的根目录输入下面命令: ~~~ >php think build ~~~ 如果看到输出 ~~~ Successed ~~~ 则表示自动生成成功。 默认会读取应用目录`application`下面的`build.php` 作为自动生成的定义文件,如果你的定义文件位置不同,则需要使用`--config`参数指定如下: ~~~ >php think build --config build.php ~~~ 表示读取根目录下的`build.php`文件。 生成模块指令 ~~~ >php think build --module test ~~~ 表示自动生成`test`模块。 ## 添加自动生成代码 如果你不习惯命令行操作,也可以直接调用`\think\Build`类的方法进行自动生成,例如: ~~~ // 定义应用目录 define('APP_PATH', __DIR__ . '/../application/'); // 加载框架引导文件 require __DIR__ . '/../thinkphp/start.php'; // 读取自动生成定义文件 $build = include 'build.php'; // 运行自动生成 \think\Build::run($build); ~~~ `run`方法第二个参数用于指定要生成的应用类库的命名空间,默认是`app`,第三个参数是设置是否需要使用类后缀。 例如: ~~~ // 定义应用目录 define('APP_PATH', __DIR__ . '/../application/'); // 加载框架引导文件 require __DIR__ . '/../thinkphp/start.php'; // 读取自动生成定义文件 $build = include 'build.php'; // 运行自动生成 \think\Build::run($build,'application',true); ~~~ 可以不依赖自动生成文件,直接使用默认目录生成模块,例如: ~~~ // 定义应用目录 define('APP_PATH', __DIR__ . '/../application/'); // 加载框架引导文件 require __DIR__ . '/../thinkphp/start.php'; // 自动生成admin模块 \think\Build::module('admin'); ~~~ `module`方法第二个参数和第三个参数的用法和`run`方法一样。
';

命令行

最后更新于:2022-04-01 21:26:26

ThinkPHP5.0支持`Console`应用,通过命令行的方式执行一些URL访问不方便或者安全性较高的操作。 我们可以在命令行下面,切换到应用根目录,然后执行`php think`,会出现下面的提示信息: ~~~ >php think 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 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:route Build route cache. ~~~ `console`命令的执行格式一般为: >[info]### >php think 指令 参数 下面介绍下系统自带的几个命令,包括: |指令 | 描述| |---|---| |build|自动生成目录和文件| |help|帮助| |list|指令列表| |clear|清除缓存指令| |make:controller|创建控制器文件| |make:model|创建模型文件| |optimize:autoload|生成类库映射文件| |optimize:config|生成配置缓存文件| |optimize:route|生成路由缓存文件| |optimize:schema|生成数据表字段缓存文件| 更多的指令可以自己扩展。
';

标签扩展

最后更新于:2022-04-01 21:26:24

## 标签库加载 模板中加载标签库,预加载自定义标签库,扩展内置标签库的加载 请参考:模板/标签库 >[info]建议开发者将自定义标签库请放置应用目录中,请勿放在框架系统目录内,以免使用`Composer`更新框架时导致自定义标签库的丢失 下面以标签库放在`common`作为一个示例: ~~~ ['attr' => 'time,format', 'close' => 0], //闭合标签,默认为不闭合 'open' => ['attr' => 'name,type', 'close' => 1], ]; /** * 这是一个闭合标签的简单演示 */ public function tagClose($tag) { $format = empty($tag['format']) ? 'Y-m-d H:i:s' : $tag['format']; $time = empty($tag['time']) ? time() : $tag['time']; $parse = ''; return $parse; } /** * 这是一个非闭合标签的简单演示 */ public function tagOpen($tag, $content) { $type = empty($tag['type']) ? 0 : 1; // 这个type目的是为了区分类型,一般来源是数据库 $name = $tag['name']; // name是必填项,这里不做判断了 $parse = ''; $parse .= '{volist name="__LIST__" id="' . $name . '"}'; $parse .= $content; $parse .= '{/volist}'; return $parse; } } ~~~ 这时候我们的控制器继承`Controller`,在配置参数中配置: ~~~ 'template' => [ // 模板引擎类型 支持 php think 支持扩展 'type' => 'Think', // 模板路径 'view_path' => '', // 模板后缀 'view_suffix' => '.html', // 预先加载的标签库 'taglib_pre_load' => 'app\common\taglib\Demo', ], ~~~ 我们就可以在控制器中对模版赋值: ~~~ //给模版给以一个当前请求时间戳的值 $this->assign('demo_time',$this->request->time()); ~~~ 在模版中调用我们已经预先加载的标签: ~~~

闭合标签

{demo:close time='$demo_time'/}

非闭合标签

{demo:open name='demo_name'} {$key}=>{$demo_name}
{/demo:open}
{demo:open name='demo_name' type='1'} {$key}=>{$demo_name}
{/demo:open} ~~~ ## 关于标签库开发 暂时可以参考3.2的官方手册中关于标签库扩展的部分,建议自己分析内置标签库Cx。
';