赞
踩
路由功能由\think\Route
类完成。
1 普通模式
关闭路由,完全使用默认的PATH_INFO方式URL
'url_route_on' => false,
2 混合模式
开启路由,并使用路由定义+默认PATH_INFO方式的混合
- 'url_route_on' => true,
-
- 'url_route_must' => false,
3 强制模式
开启路由,并设置必须定义路由才能访问
- 'url_route_on' => true,
-
- 'url_route_must' => true,
路由定义采用\think\Route
类的rule
方法注册,通常是在应用的路由配置文件application/route.php
进行注册,格式是:
Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');
例如注册如下路由规则:
- use think\Route;
-
- // 注册路由到index模块的News控制器的read操作
-
- Route::rule('new/:id','index/News/read');
我们访问:http://serverName/new/5 会自动路由到:http://serverName/index/news/read/id/5 并且原来的访问地址会自动失效。
1 规则表达式
规则表达式通常包含静态地址和动态地址,或者两种地址的结合,例如下面都属于有效的规则表达式:
- '/' => 'index', // 首页访问路由
- 'my' => 'Member/myinfo', // 静态地址路由
- 'blog/:id' => 'Blog/read', // 静态地址和动态地址结合
- ':user/:blog_id'=>'Blog/read', // 全动态地址
-
-
例如:Route::rule('new/:id','index/article/details');
浏览器输入:http://serverName/new/5 实际上访问的地址是 http://serverName/index/article/details/id/5
支持对路由参数的可选定义,可选参数只能放到路由规则的最后,如果在中间使用了可选参数的话,后面的变量都会变成可选参数。
- 'blog/:year/[:month]'=>'Blog/archive',
-
- [:month]变量用[ ]包含起来后就表示该变量是路由匹配的可选变量。
完全匹配
规则匹配检测的时候只是对URL从头开始匹配,只要URL地址包含了定义的路由规则就会匹配成功,如果希望完全匹配,可以在路由表达式最后使用$
符号
如果希望所有的路由定义都是完全匹配的话,可以直接配置
// 开启路由定义的全局完全匹配'route_complete_match' => true,
当开启全局完全匹配的时候,如果个别路由不需要使用完整匹配,可以添加路由参数覆盖定义:
Route::rule('new/:id','News/read','GET|POST',['complete_match' => false]);
定义方式 | 定义格式 |
---|---|
方式1:路由到模块/控制器 | '[模块/控制器/操作]?额外参数1=值1&额外参数2=值2...' |
方式2:路由到重定向地址 | '外部地址'(默认301重定向) 或者 ['外部地址','重定向代码'] |
方式3:路由到控制器的方法 | '@[模块/控制器/]操作' |
方式4:路由到类的方法 | '\完整的命名空间类::静态方法' 或者 '\完整的命名空间类@动态方法' |
方式5:路由到闭包函数 | 闭包函数定义(支持参数传入) |
解析规则是从操作开始解析,然后解析控制器,最后解析模块
举例
- blog/:id'=>'index/blog/read', // 路由到模块/控制器/操作
-
- 'blog/:id'=>'@index/blog/read', // 路由到操作方法 区别是直接执行某个控制器类的方法,而不需要去解析 模块/控制器/操作
-
- 'blog/:id'=>'\app\index\service\Blog@read', //路由到类的方法
-
- 'blog/:id'=>'http://blog.thinkphp.cn/read/:id', // 路由到重定向地址
3 请求类型
请求类型包括:请求类型参数必须大写。
- 类型 描述
-
- GET GET请求
-
- POST POST请求
-
- PUT PUT请求
-
- DELETE DELETE请求
-
- * 任何请求类型
系统提供了为不同的请求类型定义路由规则的简化方法,例如:
- Route::get('new/:id','News/read'); // 定义GET请求路由规则
-
- Route::post('new/:id','News/update'); // 定义POST请求路由规则
-
- Route::put('new/:id','News/update'); // 定义PUT请求路由规则
-
- Route::delete('new/:id','News/delete'); // 定义DELETE请求路由规则
-
- Route::any('new/:id','News/read'); // 所有请求都支持的路由规则
如果要定义get和post请求支持的路由规则,也可以用:
Route::rule('new/:id','News/read','GET|POST');
我们也可以批量注册路由规则,例如:
Route::rule(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']);
4 路由参数 路由参数是指可以设置一些路由匹配的条件参数,主要用于验证当前的路由规则是否有效
参数 | 说明 |
---|---|
method | 请求类型检测,支持多个请求类型 |
ext | URL后缀检测,支持匹配多个后缀 |
deny_ext | URL禁止后缀检测,支持匹配多个后缀 |
https | 检测是否https请求 |
domain | 域名检测 |
before_behavior | 前置行为(检测) |
after_behavior | 后置行为(执行) |
callback | 自定义检测方法 |
merge_extra_vars | 合并额外参数 |
bind_model | 绑定模型(V5.0.1+ ) |
cache | 请求缓存(V5.0.1+ ) |
param_depr | 路由参数分隔符(V5.0.2+ ) |
ajax | Ajax检测(V5.0.2+ ) |
pjax | Pjax检测(V5.0.2+ ) |
举例
- // 检测路由规则仅GET请求有效
-
- Route::any('new/:id','News/read',['method'=>'get']);
-
- // 定义GET请求路由规则 并设置URL后缀为shtml或html的时候有效
-
- Route::get('new/:id','News/read',['ext'=>'shtml|html']);
-
- // 完整域名检测 只在news.thinkphp.cn访问时路由有效
-
- Route::get('new/:id','News/read',['domain'=>'news.thinkphp.cn']);
-
- // 子域名检测
-
- Route::get('new/:id','News/read',['domain'=>'news']);
-
- //支持检测当前是否HTTPS访问
-
- Route::get('new/:id','News/read',['https'=>true]);
-
- // 支持使用行为对路由进行检测是否匹配,如果行为方法返回false表示当前路由规则无效。
-
- Route::get('user/:id','index/User/read',['before_behavior'=>'\app\index\behavior\UserCheck']);
-
- // 可以为某个路由或者某个分组路由定义后置行为执行,表示当路由匹配成功后,执行的行为
-
- Route::get('user/:id','User/read',['after_behavior'=>'\app\index\behavior\ReadInfo']);
-
- // 也可以支持使用函数检测路由,如果函数返回false则表示当前路由规则无效,函数写在common.php里
-
- Route::get('new/:id','News/read',['callback'=>'my_check_fun']);
-
- // 通常用于完整匹配的情况,如果有额外的参数则合并作为变量值
-
- Route::get('new/:name$','News/read',['merge_extra_vars'=>true]);
-
- // 可以在当前路由匹配后绑定模型,后面则同过方法的对象自动注入来获取。
-
- Route::get('new/:name$','News/read',['bind_model'=>['User','name']]);
-
- // 可以对当前的路由请求进行缓存处理
-
- Route::get('new/:name$','News/read',['cache'=>3600]);
5 变量规则
全局变量规则 设置全局变量规则,全部路由有效
- // 设置id变量规则(采用正则定义)
-
- Route::pattern('id','\w+');
-
-
- // 支持批量添加
-
- Route::pattern([
-
- 'id' => '\d+',
-
- 'name' => '\w+',
-
- ]);
局部变量规则 局部变量规则,仅在当前路由有效
- // 定义GET请求路由规则 并设置id变量规则
-
- Route::get('new/:id','index/article/details',['id'=>'\w+']);
-
- Route::rule('new/:id','index/article/details','get',['id'=>'\w+']);
如果一个变量同时定义了全局规则和局部规则,局部规则会覆盖全局变量的定义。
批量注册
- Route::rule([
-
- '路由规则1'=>'路由地址和参数',
-
- '路由规则2'=>['路由地址和参数','匹配参数(数组)',
-
- '变量规则(数组)']
-
- ...
-
- ],'','请求类型','匹配参数(数组)','变量规则');
定义路由配置文件
除了支持动态注册,也可以直接在应用目录下面的route.php
的最后通过返回数组的方式直接定义路由规则
- return [
-
- 'new/:id' => 'News/read',
-
- ];
默认情况下,只会加载一个路由配置文件route.php
,如果你需要定义多个路由文件,可以修改route_config_file
配置参数
默认情况下,只会加载一个路由配置文件route.php,如果你需要定义多个路由文件,可以修改route_config_file配置参数
完整URL规则
如果要对整个URL进行规则检查,可以进行__url__
变量规则,例如:
- // 定义GET请求路由规则 并设置完整URL变量规则
-
- Route::get('new/:id','News/read',[],['__url__'=>'new\/\d+$']);
路由别名
路由别名功能可以使用一条规则,批量定义一系列的路由规则。
- // user 别名路由到 index/User 控制器
-
- Route::alias('user','index/User');
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。