ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
新版的路由经过重新设计,功能大为增强,主要特性有: ## 动态注册路由 除了在路由配置文件中定义,现在可以通过\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+']); ~~~