`V6.0.3`版本终于更新发布了,本文总结下该版本的几个关键更新和升级注意事项。 ## 主要更新 ### 事件机制不再支持关闭 由于事件机制对于扩展开发的重要性,如果关闭事件机制会导致开发扩展的复杂度加大,考虑到事件机制本身的开销并不大,所以新版不再支持关闭事件机制,并废弃了`Event`类的`withEvent`方法。 ### 严格按照定义顺序执行路由的检测 之前路由的检测机制由于不同的请求类型的路由定义是分组存放的,而且所有的分组路由都是统一放到`any`请求类型下的,所以会导致在最终执行路由检测的顺序并非严格的定义顺序,如果你存在同名的路由定义和分组,路由定义会优先检测而不是按照路由定义的顺序进行路由匹配检测。例如存在下面的路由定义: ![](https://img.kancloud.cn/ee/5c/ee5c0318d4751ea59bedbb120a93e389_579x285.png) 之前的版本访问`/api/test/service/my` 的话,输出的是`aa`而不是`my`,改进了严格按照定义顺序执行路由检测后,输出的结果就变成`my`。 此次更新对路由定义的存储结构做了优化,确保严格按照定义顺序来依次存储,从而避免出现因为路由定义和检测顺序不一致的情况而产生的路由混乱。 ### 支持路由到自定义调度类 路由支持路由到一个自定义的路由调度类,从而实现更高级的自定义路由解析,此前你可能必须通过路由到闭包的方式实现自定义解析。 ~~~ // 路由到自定义调度类 Route::get('blog/:name',\app\route\BlogDispatch::class); ~~~ ~~~ namespace app\route; use think\route\Dispatch; use think\route\Rule; use think\Request; class BlogDispatch extends Dispatch { public function exec() { // 自定义路由调度 } } ~~~ 具体调度类的实现可以参考内置的几个调度类的实现。 ### 取消调试模式下默认异常页面的系统信息显示 由于开启调试模式后,默认的异常页面中会显示当前系统的环境变量等系统信息,有些用户经常在正式环境中开启调试模式,容易导致敏感信息的泄露而导致安全隐患。最新版本取消了默认异常页面的系统变量的显示,如果你在本地调试的时候需要查看这些信息可以自己在页面Trace信息里面调试输出。 ### 增加`Header`方式的多语言自动侦测 由于API更多使用`header`方式而不是`GET`或者`Cookie`,新版增加了对`header`方式自动检测多语言的支持,并且优先级依次为`GET->header->Cookie`。 ### `Facade`类的IDE自动提示改进 由于之前的版本使用了`@mixin`注释完成IDE的自动提示,但由于其它IDE以及`phpstorm`新版本不支持,所以仍然改成注释的方式对系统内置Facade进行自动提示。 ### `ORM`调整 `think-orm`组件距离上一次框架版本发布以来已经有几个小版本更新,最近的调整包括: * 改进`whereTime`查询对`date`类型的支持 * 改进多对多关联 * 改进一对一关联的属性绑定当关联数据不存在的时候的数据格式的一致性 * 修正查询缓存 * 原生查询不再支持链式操作方法 ## 升级须知 虽然对于上个版本基本无缝升级,但如果你存在不规范的用法,那么升级过程中很有可能会遇到一些问题,尤其是使用原生查询的情况下,主要是ORM的一些调整导致。 下面做个注意事项的总结: ### `connect`方法返回类型调整 此次`think-orm`库更新后,Db类的`connect`方法返回类型变更为`Connection`接口而不是原来的`Query`对象(现在可以更方便的获取当前的数据库连接对象),所以你不能直接调用`Query`类的链式操作方法,必须首先调用`table`或者`name`方法指定查询的数据表。所以下面的不规范用法就会报错: ``` Db::field('name')->table('user')->find(1); ``` 规范的用法是 ``` Db::table('user')->field('name')->find(1); ``` ### `optimize:schema`指令改进 取消了`--db`选项,改用`--connection`选项指定使用的数据库连接来生成,通过不同的数据库的链接设置生成字段缓存更加合理。 ``` php think optimize:schema --connection mysql ``` 原来的数据库字段缓存是用文件方式存放在`runtime/schema`目录下,新版调整后,字段缓存直接纳入系统的缓存机制,存放目录则根据你的缓存设置不同而有所区别了。 ### 不要在模型中使用原生查询 在模型类中使用原生查询是不规范的,此次ORM的调整已经禁止在模型中调用原生查询(包括调用`query`和`execute`方法)。 如果你需要在模型的业务方法中使用原生查询,必须通过`Db`类执行。 ### `query`查询不再支持查询缓存 下面的用法不再支持: ``` Db::cache(100)->query('SELECT * FROM think_user where id= 1'); ``` >[danger] `cache`查询缓存方法并没有取消,只是不支持在`query`之前调用了 ### 原生查询指定主库查询用法调整 原来的用法 ``` Db::master(true)->query('SELECT * FROM think_user where id= 1'); ``` 调整为: ``` Db::query('SELECT * FROM think_user where id= 1', [], true); ``` >[danger] `master`方法并没有取消,只是不支持在`query`之前调用了 ### 存储过程`procedure`方法废弃 存储过程方法`procedure`不再需要,直接使用`query`或者`execute`执行存储过程语句即可。