6路由分组
未知
2021-07-04 10:20:48
0

路由分组

路由分组功能允许把相同前缀的路由定义合并分组,这样可以简化路由定义,并且提高路由匹配的效率,不必每次都去遍历完整的路由规则(尤其是开启了路由延迟解析后性能更佳)。

使用Route类的group方法进行注册,给分组路由定义一些公用的路由设置参数,例如:

Route::group('blog', function () {
    Route::rule(':id', 'blog/read');
    Route::rule(':name', 'blog/read');
})->ext('html')->pattern(['id' => '\d+', 'name' => '\w+']);
复制

分组路由支持所有的路由参数设置,具体参数的用法请参考路由参数章节内容。

如果仅仅是用于对一些路由规则设置一些公共的路由参数(也称之为虚拟分组),也可以使用:

Route::group(function () {
    Route::rule('blog/:id', 'blog/read');
    Route::rule('blog/:name', 'blog/read');
})->ext('html')->pattern(['id' => '\d+', 'name' => '\w+']);
复制

路由分组支持嵌套,例如:

Route::group(function () {
    Route::group('blog', function () {
        Route::rule(':id', 'blog/read');
        Route::rule(':name', 'blog/read');
    });
})->ext('html')->pattern(['id' => '\d+', 'name' => '\w+']);
复制

如果使用了嵌套分组的情况,子分组会继承父分组的参数和变量规则,而最终的路由规则里面定义的参数和变量规则为最优先。

可以使用prefix方法简化相同路由地址的定义,例如下面的定义

Route::group('blog', function () {
    Route::get(':id', 'blog/read');
    Route::post(':id', 'blog/update');
    Route::delete(':id', 'blog/delete');
})->ext('html')->pattern(['id' => '\d+']);
复制

可以简化为

Route::group('blog', function () {
    Route::get(':id', 'read');
    Route::post(':id', 'update');
    Route::delete(':id', 'delete');
})->prefix('blog/')->ext('html')->pattern(['id' => '\d+']);
复制

路由完全匹配

如果希望某个分组下面的路由都采用完全匹配,可以使用

Route::group('blog', function () {
    Route::get(':id', 'read');
    Route::post(':id', 'update');
    Route::delete(':id', 'delete');
})->completeMatch()->prefix('blog/')->ext('html')->pattern(['id' => '\d+']);
复制

延迟路由解析

支持延迟路由解析,也就是说你定义的路由规则(主要是分组路由和域名路由规则)在加载路由定义文件的时候并没有实际注册,而是在匹配到路由分组或者域名的情况下,才会实际进行注册和解析,大大提高了路由注册和解析的性能。

默认是关闭延迟路由解析的,你可以在路由配置文件中设置:

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

开启延迟路由解析后,如果你需要生成路由反解URL,需要使用命令行指令

php think optimize:route
复制

来生成路由缓存解析。

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

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

路由规则合并解析

同一个路由分组下的路由规则支持合并解析,而不需要遍历该路由分组下的所有路由规则,可以大大提升路由解析的性能。

对某个分组单独开启合并规则解析的用法如下:

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

这样该分组下的所有路由规则无论定义多少个都只需要匹配检查一次即可(实际上只会合并检查符合当前请求类型的路由规则)。

mergeRuleRegex方法只能用于路由分组或者域名路由(域名路由其实是一个特殊的分组)。

或者在路由配置文件中设置开启全局合并规则(对所有分组有效)

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

传入额外参数

可以统一给分组路由传入额外的参数

Route::group('blog', [
    ':id'   => 'Blog/read',
    ':name' => 'Blog/read',
])->ext('html')
->pattern(['id' => '\d+'])
->append(['group_id' => 1]);
复制

上面的分组路由统一传入了group_id参数,该参数的值可以通过Request类的param方法获取。

指定分组调度

V6.0.8+版本开始,可以给路由分组单独指定调度类,例如:

Route::group('blog', [
    ':id'   => 'Blog/read',
    ':name' => 'Blog/read',
])->dispatcher(GroupDispatcher::class);
复制

上一篇:6路由中间件

下一篇:6资源路由

相关内容

K8s在云服务器上的资源管...
K8s作为开源容器编排系统,在云服务器上实现自动化资源管理,提高运...
2024-11-20 17:23:38
普通索引与唯一索引的区别
摘要:普通索引与唯一索引在数据库中用于加速查询和保证数据唯一性。普...
2024-11-20 07:23:33
react菜单menu点击...
导航菜单点击菜单项有时不管用,样式修改不了。
2024-08-22 09:54:54
jquery实现全屏退出全...
问题描述: 做一个网站,用户需要把网站用在大屏幕上,触摸屏。所以没...
2023-12-16 15:47:06
提交按钮把提交两个字去掉
form action={$searchurl} method=g...
2021-11-03 14:25:25
sql删除相同数据保留其中...
把同个相同字段的表合并成一个表,数据有相同的,把其中一个id最小的...
2021-09-03 14:46:36

热门资讯

tp6开发规范 命名规范 请理解并尽量遵循以下命名规范,可以减少在开发过程中出现不必要的错误。 ThinkPHP6....
6高级查询 快捷查询 快捷查询方式是 一种多字段相同查询条件 的简化写法,可以进一步简化查询条件的写法,在多个字...
tp6多应用提示控制器不存在:... 第一个情况是没有使用composer安装扩展。 如果要使用多应用模式, 你需要win+r,cmd指针...
6配置 配置目录 单应用模式 对于单应用模式来说,配置文件和目录很简单,根目录下的 config 目录下面就...
6异常处理 和PHP默认的异常处理不同,ThinkPHP抛出的不是单纯的错误信息,而是一个人性化的错误页面。 异...
6swoole 本篇内容主要讲述了最新的 think-swoole 扩展的使用。目前仅支持Linux环境或者MacO...
6助手函数 助手函数 系统为一些常用的操作方法封装了助手函数,便于使用,包含如下: 助手函数 描述 abort ...
6查询表达式 查询表达式 查询表达式支持大部分的SQL查询语法,也是 ThinkPHP 查询语言的精髓,查询表达式...
6路由参数 路由参数 路由分组及规则定义支持指定路由参数,这些参数主要完成路由匹配检测以及后续行为。 路由参数可...
6查询 模型查询和数据库查询方法的区别主要在于,模型中的查询的数据在获取的时候会经过获取器的处理,以及更加对...