路由是应用开发中比较关键的一个环节,其主要作用包括但不限于:

  • 让URL更规范以及优雅;
  • 隐式传入额外请求参数;
  • 统一拦截并进行权限检查等操作;
  • 绑定请求数据;
  • 使用请求缓存;
  • 路由中间件支持(V5.1.6+);

[danger] 由于采用了路由规则的批量匹配检测算法,V5.1.6+版本开始,路由的解析性能大幅提升。

路由解析的过程一般包含:

[info] * 路由定义:完成路由规则的定义和参数设置(5.1的路由定义采用了对象化的思维,相对5.0而言更直观);

  • 路由检测:检查当前的URL请求是否有匹配的路由;
  • 路由解析:解析当前路由实际对应的操作(方法或闭包);
  • 路由调度:执行路由解析的结果调度(主业务逻辑);

掌握路由主要是要掌握路由定义及参数设置,其它环节是由系统自动完成的。

[danger] 路由的主体规划和定义应该尽可能在应用开发前完成,在后期可以进行路由的参数调整和规则增补。

路由仅针对PATHINFO方式的URL有效,ThinkPHP5.1的路由定义更加对象化,并且默认开启路由(不能关闭),如果一个URL没有定义路由,则采用默认的PATH_INFO 模式访问URL:

http://serverName/index.php/module/controller/action/param/value/...

[info] 在不使用路由的情况下,仍然可以通过操作方法的参数绑定、空控制器和空操作等特性实现URL地址的简化(参考后面的请求->参数绑定章节)。

[danger] Route类注册使用think\facade\Route类静态调用。

强制路由

app.php配置文件中设置

'url_route_must'        =>  true,

将开启强制使用路由,这种方式下面必须严格给每一个访问地址定义路由规则(包括首页),否则将抛出异常。

首页的路由规则采用/定义即可,例如下面把网站首页路由输出Hello,world!

Route::get('/', function () {
    return 'Hello,world!';
});

延迟解析

如果你定义了太多的路由,担心影响性能,可以开启路由的延迟解析功能,只需要在app.php配置文件中设置:

// 开启路由延迟解析
'url_lazy_route'    => true,

[danger] 通过路由分组或者域名路由来定义路由才能发挥延迟解析的优势。

一旦开启路由的延迟解析,将会对定义的域名路由和分组路由进行延迟解析,也就是说只有实际匹配到该域名或者分组后才会进行路由规则的注册,避免不必要的注册和解析开销。

[info] 推荐的方式是开发模式下关闭延迟解析,部署后开启并生成路由映射缓存。

[danger] 开启路由延迟解析后,将会导致你的URL生成无法准确识别路由规则的反解,但可以通过路由映射缓存指令(参考命令行章节的生成路由映射缓存一节)来解决。

路由规则合并解析(v5.1.6+

V5.1.6+版本开始,路由规则支持合并解析,可以大大提升路由解析的性能。

可以在app.php文件中设置开启全局合并规则,

// 开启路由合并解析
'route_rule_merge'    => true,

或者在路由定义的时候对某个分组单独开启合并规则解析。

Route::group('', function () {
    Route::rule('hello/:name','hello');
    Route::rule('think/:name','think');
})->mergeRuleRegex();

这样该分组下的所有路由规则无论定义多少个都只需要匹配检查一次即可。

[danger] mergeRuleRegex方法只能用于路由分组或者域名路由。

路由缓存(V5.1.14+

V5.1.14+版本开始,支持路由缓存功能,对于路由规则较多的应用可以大幅提升路由性能(仅部署模式有效)。

// 开启路由缓存
'route_check_cache'    => true,

[danger] 如果路由定义中,有某个路由规则的路由地址使用了闭包的方式,那么路由缓存将会失效。