### 路由分组
相信通过前面几篇的学习,你已经掌握了基本的路由用法,本篇内容要讲解的路由分组的引入是为了简化路由规则的定义,以及提高路由的解析性能而设计的。
下面就来揭开分组的神秘面纱吧。
#### 分组定义
在实际的使用中,会涉及到大量的相同URL前缀的路由规则,例如下面的一组路由:
~~~
Route::get('blog/:year/:month','blog/archive',['ext'=>'html'],['year'=>'\d{4}','month'=>'\d{2}']);
Route::get('blog/:cate','blog/index',['ext'=>'html'],['cate'=>'[a-zA-Z]+']);
Route::get('blog/:id','blog/read',['ext'=>'html'],['id'=>'\d+']);
Route::get('blog','blog/index',['ext'=>'html']);
~~~
除了定义起来略显麻烦之外,而且在匹配路由的时候也会整个遍历,通过路由分组可以简化为:
~~~
Route::group('blog', [
':year/:month' => 'blog/archive',
':cate' => 'blog/index',
':id' => 'blog/read',
'/' => 'blog/index',
],['ext'=>'html'],['year'=>'\d{4}','month'=>'\d{2}','cate'=>'[a-zA-Z]+','id'=>'\d+']);
~~~
当然,也可以使用闭包方式定义:
~~~
Route::group('blog', function(){
Route::get(':year/:month','blog/archive');
Route::get(':cate','blog/index');
Route::get(':id','blog/read');
Route::get('/','blog/index');
},['ext'=>'html'],['year'=>'\d{4}','month'=>'\d{2}','cate'=>'[a-zA-Z]+','id'=>'\d+']);
~~~
分组本身没有请求类型的限制,也就是说分组对所有请求类型都是有效的,对请求类型有限制的是分组下面的路由规则本身。
【5.1须知】
5.1可以使用下面的方式更清晰注册
~~~
Route::group('blog', function(){
Route::get(':year/:month','blog/archive');
Route::get(':cate','blog/index');
Route::get(':id','blog/read');
Route::get('/','blog/index');
})->ext('html')
->pattern(['year'=>'\d{4}','month'=>'\d{2}','cate'=>'[a-zA-Z]+','id'=>'\d+']);
~~~
路由分组在执行路由匹配的时候,首先会匹配URL地址是否为分组名开头,如果符合才会进行分组下面的路由匹配。
当然,分组远不止这么简单,下面我们会陆续领略到分组的强大。
#### 路由地址前缀
可以给分组的路由地址定义一个统一的前缀
~~~
Route::group('blog', [
':year/:month' => ['archive', ['method'=>'get']],
':cate' => 'index',
':id' => 'read',
],['ext'=>'html','prefix'=>'index/blog/'],['year'=>'\d{4}','month'=>'\d{2}','cate'=>'[a-zA-Z]+','id'=>'\d+']);
~~~
使用`prefix路由参数`统一配置路由地址的前缀,可以简化分组的路由地址的定义。
#### 小结
路由分组的定义格式
> Route::group('分组名或分组参数','分组路由规则','公共路由参数','公共变量规则');
group方法的第一个参数为字符串表示分组名,如果是数组就表示该分组的公共路由参数。