新版的路由经过重新设计,功能大为增强,主要特性有:
## 动态注册路由
除了在路由配置文件中定义,现在可以通过\Think\Route类的静态方法注册路由。
最关键的方法是register方法,用法如下:
~~~
// 除了路由规则和路由地址外,其他都是可选
\Think\Route::register('路由规则','路由地址'[,'请求类型','路由参数','变量规则']);
~~~
如果没有传入请求类型的话,默认的是任何请求类型都有效,可以指定其他请求类型:
~~~
\Think\Route::register('new/:id','New/update','POST');
~~~
如果要定义get和post请求支持的路由规则,也可以用:
~~~
\Think\Route::register('new/:id','New/read','GET|POST');
~~~
请求类型包括:
|类型|描述|
|---|---|
|GET| 表示GET请求|
|POST| 表示POST请求|
|PUT| 表示PUT请求|
|DELETE |表示DELETE请求|
|* |表示任何请求类型|
系统提供了不同的请求类型简化方法,例如:
~~~
// 定义GET请求路由规则
\Think\Route::get('路由规则','路由地址','路由参数','变量规则');
// 定义POST请求路由规则
\Think\Route::post('路由规则','路由地址','路由参数','变量规则');
// 定义PUT请求路由规则
\Think\Route::put('路由规则','路由地址','路由参数','变量规则');
// 定义DELETE请求路由规则
\Think\Route::delete('路由规则','路由地址','路由参数','变量规则');
// 所有请求都支持的路由规则
\Think\Route::any('路由规则','路由地址','路由参数','变量规则');
~~~
例如:
~~~
\Think\Route::get('new/:id','New/read'); // 定义GET请求路由规则
\Think\Route::post('new/:id','New/update'); // 定义POST请求路由规则
\Think\Route::put('new/:id','New/update'); // 定义PUT请求路由规则
\Think\Route::delete('new/:id','New/delete'); // 定义DELETE请求路由规则
\Think\Route::any('new/:id','New/read'); // 所有请求都支持的路由规则
~~~
## 闭包路由的增强
闭包路由可以进行路由劫持或者中断处理,如果返回的是一个数组,那么表示路由到数组表示的模块、控制器和操作继续进行,例如:
~~~
\Think\Route::get('new/:id',function($id){
// 这里进行必要的处理
// 返回路由信息
return ['index','new','read'];
}); // 定义GET请求路由规则
~~~
> 如果直接输出或者返回字符串变量的话,闭包方法执行后会终止执行后续的操作。
## 路由参数
路由参数主要用于验证当前的路由规则是否有效,支持请求类型(method)、URL后缀(ext)、HTTPS请求(https)以及自定义检测机制(callback),使用方法:
~~~
// 定义GET请求路由规则 并设置URL后缀为html的时候有效
\Think\Route::get('new/:id','New/read',['ext'=>'html']);
~~~
## 变量规则
ThinkPHP5.0支持在规则路由中为变量用正则的方式指定变量规则,弥补了之前变量规则太局限的问题,并且支持全局规则设置。使用方式如下:
设置全局变量规则,全局路由有效:
~~~
// 设置name变量的正则规则
\Think\Route::pattern('name','\w+');
// 支持批量添加
\Think\Route::pattern(['name'=>'\w+','id'=>'\d+']);
~~~
局部变量规则,仅在当前路由有效:
~~~
// 定义GET请求路由规则 并设置name变量规则
\Think\Route::get('new/:id','New/read',[],['name'=>'\w+']);
~~~
如果一个变量同时定义了全局规则和局部规则,局部规则会覆盖全局变量的定义。
## 域名路由
可以给(子)域名或者IP指定路由规则,例如:
~~~
// blog.thinkphp.cn 路由到index模块的blog控制器
\Think\Route::domain('blog.thinkphp.cn','index/blog');
// admin.thinkphp.cn 路由到admin模块
\Think\Route::domain('admin.thinkphp.cn','admin');
~~~
## 路由分组
路由定义多了之后效率会变低,这个时候可以使用路由分组功能,把相同前缀的路由规则定义到一个分组,并且为分组定义相同的路由参数。
~~~
\Think\Route::group('new',[':id'=>'New/read',':name'=>'New/read'],'GET',['ext'=>'html'],['name'=>'\w+','id'=>'\d+']);
// 相当于同时注册以下路由
\Think\Route::register('new/:id','New/read','GET',['ext'=>'html'],['id'=>'\d+']);
\Think\Route::register('new/:name','New/read','GET',['ext'=>'html'],['name'=>'\w+']);
~~~