# 路由
路由是应用开发中比较关键的一个环节,其主要作用包括但不限于:
- 让URL更规范以及优雅;
- 隐式传入额外请求参数;
- 统一拦截并进行权限检查等操作;
- 绑定请求数据;
- 使用请求缓存;
- 路由中间件支持(`V5.1.6+`);
> 由于采用了路由规则的批量匹配检测算法,`V5.1.6+`版本开始,路由的解析性能大幅提升。
路由解析的过程一般包含:
> - 路由定义:完成路由规则的定义和参数设置(5.1的路由定义采用了对象化的思维,相对5.0而言更直观);
> - 路由检测:检查当前的URL请求是否有匹配的路由;
> - 路由解析:解析当前路由实际对应的操作(方法或闭包);
> - 路由调度:执行路由解析的结果调度(主业务逻辑);
掌握路由主要是要掌握路由定义及参数设置,其它环节是由系统自动完成的。
> 路由的主体规划和定义应该尽可能在应用开发前完成,在后期可以进行路由的参数调整和规则增补。
路由仅针对PATHINFO方式的URL有效,`ThinkPHP5.1`的路由定义更加对象化,并且默认开启路由(不能关闭),如果一个URL没有定义路由,则采用默认的`PATH_INFO` 模式访问URL:
```
http://serverName/index.php/module/controller/action/param/value/...
```
> 在不使用路由的情况下,仍然可以通过操作方法的参数绑定、空控制器和空操作等特性实现URL地址的简化(参考后面的请求->参数绑定章节)。
> `Route`类注册使用`think\facade\Route`类静态调用。
## 强制路由
在`app.php`配置文件中设置
```
'url_route_must' => true,
```
将开启强制使用路由,这种方式下面必须严格给每一个访问地址定义路由规则(**包括首页**),否则将抛出异常。
首页的路由规则采用`/`定义即可,例如下面把网站首页路由输出`Hello,world!`
```
Route::get('/', function () {
return 'Hello,world!';
});
```
## 延迟解析
如果你定义了太多的路由,担心影响性能,可以开启路由的延迟解析功能,只需要在`app.php`配置文件中设置:
```
// 开启路由延迟解析
'url_lazy_route' => true,
```
> 通过路由分组或者域名路由来定义路由才能发挥延迟解析的优势。
一旦开启路由的延迟解析,将会对定义的域名路由和分组路由进行延迟解析,也就是说只有实际匹配到该域名或者分组后才会进行路由规则的注册,避免不必要的注册和解析开销。
> 推荐的方式是开发模式下关闭延迟解析,部署后开启并生成路由映射缓存。
> 开启路由延迟解析后,将会导致你的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();
```
这样该分组下的所有路由规则无论定义多少个都只需要匹配检查一次即可。
> `mergeRuleRegex`方法只能用于路由分组或者域名路由。
## 路由缓存(`V5.1.14+`)
从`V5.1.14+`版本开始,支持路由缓存功能,对于路由规则较多的应用可以大幅提升路由性能(仅部署模式有效)。
```
// 开启路由缓存
'route_check_cache' => true,
```
> 如果路由定义中,有某个路由规则的路由地址使用了闭包的方式,那么路由缓存将会失效。
- 序言
- 基础
- 安装
- 开发规范
- 目录结构
- 配置
- 架构
- 架构总览
- 入口文件
- URL访问
- 模块设计
- 命名空间
- 容器和依赖注入
- Facade
- 钩子和行为
- 中间件
- 路由
- 路由定义
- 变量规则
- 路由地址
- 闭包支持
- 路由参数
- 路由缓存
- 跨域请求
- 注解路由
- 路由分组
- MISS路由
- 资源路由
- 快捷路由
- 路由别名
- 路由绑定
- 域名路由
- URL生成
- 控制器
- 控制器定义
- 前置操作
- 跳转和重定向
- 空操作和空控制器
- 分层控制器
- 资源控制器
- 请求
- 请求对象
- 请求信息
- 输入变量
- 请求类型
- HTTP头信息
- 伪静态
- 参数绑定
- 请求缓存
- 响应
- 响应输出
- 响应参数
- 重定向
- 数据库
- 连接数据库
- 查询构造器
- 查询数据
- 添加数据
- 更新数据
- 删除数据
- 查询表达式
- 链式操作
- 聚合查询
- 时间查询
- 高级查询
- 视图查询
- JSON字段
- 子查询
- 原生查询
- 查询事件
- 事务操作
- 监听SQL
- 存储过程
- 数据集
- 分布式数据库
- 模型
- 定义
- 新增
- 更新
- 删除
- 查询
- JSON字段
- 获取器
- 修改器
- 自动时间戳
- 只读字段
- 软删除
- 类型转换
- 数据完成
- 查询范围
- 模型输出
- 模型事件
- 模型关联
- 一对一关联
- 一对多关联
- 远程一对多
- 多对多关联
- 多态关联
- 关联预载入
- 关联统计
- 关联输出
- 视图
- 视图渲染
- 视图赋值
- 视图过滤
- 模板引擎
- 模板
- 变量输出
- 使用函数
- 运算符
- 原样输出
- 模板注释
- 模板布局
- 模板继承
- 包含文件
- 输出替换
- 标签库
- 内置标签
- 循环标签
- 比较标签
- 条件判断
- 资源文件加载
- 标签嵌套
- 原生PHP
- 定义标签
- 标签扩展
- 错误和日志
- 异常处理
- 日志处理
- 调试
- 调试模式
- Trace调试
- 性能调试
- SQL调试
- 变量调试
- 远程调试
- 验证
- 验证器
- 验证规则
- 错误信息
- 验证场景
- 路由验证
- 内置规则
- 独立验证
- 静态调用
- 表单令牌
- 杂项
- 缓存
- Session
- Cookie
- 多语言
- 分页
- 上传
- 命令行
- 启动内置服务器
- 自动生成目录结构
- 创建类库文件
- 生成类库映射文件
- 清除缓存文件
- 生成配置缓存文件
- 生成数据表字段缓存
- 生成路由映射缓存
- 自定义指令
- 扩展库
- 验证码
- 图像处理
- Time
- 数据库迁移工具
- Workerman
- MongoDb
- 单元测试
- 安全和性能
- 安全建议
- 优化建议
- 附录
- 助手函数
- 升级指导
- 更新日志