thinkphp6路由分组介绍

本文介绍了ThinkPHP6中的路由分组功能,包括路由分组的概念、如何使用group方法进行分组,以及prefix方法简化相同路由地址定义。还探讨了路由完全匹配、延迟路由解析、路由规则合并解析和传入额外参数等特性,这些特性有助于优化路由定义和提高性能。

什么是路由分组

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

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

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

qipa控制器中的read方法

    public function read()
    {
        echo 'www.qipa250.com-read-id=' . Request::param('id');
        echo "<br>";
        echo 'www.qipa250.com-read-name=' . Request::param('name');
    }

http://mac.tp6.com/qipa/250.html
在这里插入图片描述

http://mac.tp6.com/qipa/xiaoming.html
在这里插入图片描述

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

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

Route::group(function () {
    Route::rule('qipa/:id', 'qipa/read');
    Route::rule('qipa/:name', 'qipa/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+']);

嵌套多个分组

Route::group('qipagroup',function () {

    Route::group('qipa', function () {
        Route::rule(':id', 'qipa/read');
        Route::rule(':name', 'qipa/read');
    });

    Route::group('qipabook', function () {
        Route::rule(':id', 'qipa/readbook');
        Route::rule(':name', 'qipa/readbook');
    });

})->ext('html')->pattern(['id' => '\d+', 'name' => '\w+']);

qipa控制器的readbook方法

   public function readbook()
    {
       halt(Request::param());
    }

读取的时候需要先写外部分组别名
http://mac.tp6.com/qipagroup/qipabook/250.html
在这里插入图片描述

http://mac.tp6.com/qipagroup/qipa/250.html

在这里插入图片描述

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

prefix方法简化相同路由地址定义

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

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

可以简化为

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

在这里插入图片描述

路由完全匹配completeMatch函数

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

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

http://mac.tp6.com/qipa/888/aaa.html
在这里插入图片描述
http://mac.tp6.com/qipa/888.html
在这里插入图片描述
必须完全符合规则,才可以

延迟路由解析

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

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

// 开启路由延迟解析
'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('qipa', function () {
    Route::get(':id', 'readbook');
    Route::post(':id', 'update');
    Route::delete(':id', 'delete');
})->completeMatch()->prefix('qipa/')->ext('html')->pattern(['id' => '\d+'])->append(['url' => 'www.qipa250.com']);

http://mac.tp6.com/qipa/888.html
在这里插入图片描述

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值