当前位置:   article > 正文

thinkphp——路由_thinkphp8路由配置

thinkphp8路由配置

路由功能由\think\Route类完成。

一 路由模式

1 普通模式

关闭路由,完全使用默认的PATH_INFO方式URL

'url_route_on'  =>  false,

2 混合模式

开启路由,并使用路由定义+默认PATH_INFO方式的混合

  1. 'url_route_on' => true,
  2. 'url_route_must' => false,

3 强制模式

开启路由,并设置必须定义路由才能访问

  1. 'url_route_on' => true,
  2. 'url_route_must' => true,

二 路由注册(Route::rule())

路由定义采用\think\Route类的rule方法注册,通常是在应用的路由配置文件application/route.php进行注册,格式是:

Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');

例如注册如下路由规则:

  1. use think\Route;
  2. // 注册路由到index模块的News控制器的read操作
  3. Route::rule('new/:id','index/News/read');

我们访问:http://serverName/new/5  会自动路由到:http://serverName/index/news/read/id/5 并且原来的访问地址会自动失效。

1 规则表达式

规则表达式通常包含静态地址和动态地址,或者两种地址的结合,例如下面都属于有效的规则表达式:

  1. '/' => 'index', // 首页访问路由
  2. 'my' => 'Member/myinfo', // 静态地址路由
  3. 'blog/:id' => 'Blog/read', // 静态地址和动态地址结合
  4. ':user/:blog_id'=>'Blog/read', // 全动态地址

例如:Route::rule('new/:id','index/article/details');
浏览器输入:http://serverName/new/5 实际上访问的地址是  http://serverName/index/article/details/id/5

支持对路由参数的可选定义,可选参数只能放到路由规则的最后,如果在中间使用了可选参数的话,后面的变量都会变成可选参数。

  1. 'blog/:year/[:month]'=>'Blog/archive',
  2. [: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:路由到闭包函数闭包函数定义(支持参数传入)

解析规则是从操作开始解析,然后解析控制器,最后解析模块

举例

  1. blog/:id'=>'index/blog/read', // 路由到模块/控制器/操作
  2. 'blog/:id'=>'@index/blog/read', // 路由到操作方法 区别是直接执行某个控制器类的方法,而不需要去解析 模块/控制器/操作
  3. 'blog/:id'=>'\app\index\service\Blog@read', //路由到类的方法
  4. 'blog/:id'=>'http://blog.thinkphp.cn/read/:id', // 路由到重定向地址

 

3 请求类型

请求类型包括:请求类型参数必须大写。

  1. 类型 描述
  2. GET GET请求
  3. POST POST请求
  4. PUT PUT请求
  5. DELETE DELETE请求
  6. * 任何请求类型

系统提供了为不同的请求类型定义路由规则的简化方法,例如:

  1. Route::get('new/:id','News/read'); // 定义GET请求路由规则
  2. Route::post('new/:id','News/update'); // 定义POST请求路由规则
  3. Route::put('new/:id','News/update'); // 定义PUT请求路由规则
  4. Route::delete('new/:id','News/delete'); // 定义DELETE请求路由规则
  5. 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请求类型检测,支持多个请求类型
extURL后缀检测,支持匹配多个后缀
deny_extURL禁止后缀检测,支持匹配多个后缀
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+
ajaxAjax检测(V5.0.2+
pjaxPjax检测(V5.0.2+

举例

  1. // 检测路由规则仅GET请求有效
  2. Route::any('new/:id','News/read',['method'=>'get']);
  3. // 定义GET请求路由规则 并设置URL后缀为shtml或html的时候有效
  4. Route::get('new/:id','News/read',['ext'=>'shtml|html']);
  5. // 完整域名检测 只在news.thinkphp.cn访问时路由有效
  6. Route::get('new/:id','News/read',['domain'=>'news.thinkphp.cn']);
  7. // 子域名检测
  8. Route::get('new/:id','News/read',['domain'=>'news']);
  9. //支持检测当前是否HTTPS访问
  10. Route::get('new/:id','News/read',['https'=>true]);
  11. // 支持使用行为对路由进行检测是否匹配,如果行为方法返回false表示当前路由规则无效。
  12. Route::get('user/:id','index/User/read',['before_behavior'=>'\app\index\behavior\UserCheck']);
  13. // 可以为某个路由或者某个分组路由定义后置行为执行,表示当路由匹配成功后,执行的行为
  14. Route::get('user/:id','User/read',['after_behavior'=>'\app\index\behavior\ReadInfo']);
  15. // 也可以支持使用函数检测路由,如果函数返回false则表示当前路由规则无效,函数写在common.php里
  16. Route::get('new/:id','News/read',['callback'=>'my_check_fun']);
  17. // 通常用于完整匹配的情况,如果有额外的参数则合并作为变量值
  18. Route::get('new/:name$','News/read',['merge_extra_vars'=>true]);
  19. // 可以在当前路由匹配后绑定模型,后面则同过方法的对象自动注入来获取。
  20. Route::get('new/:name$','News/read',['bind_model'=>['User','name']]);
  21. // 可以对当前的路由请求进行缓存处理
  22. Route::get('new/:name$','News/read',['cache'=>3600]);

5 变量规则

全局变量规则 设置全局变量规则,全部路由有效

  1. // 设置id变量规则(采用正则定义)
  2. Route::pattern('id','\w+');
  3. // 支持批量添加
  4. Route::pattern([
  5. 'id' => '\d+',
  6. 'name' => '\w+',
  7. ]);

局部变量规则 局部变量规则,仅在当前路由有效

  1. // 定义GET请求路由规则 并设置id变量规则
  2. Route::get('new/:id','index/article/details',['id'=>'\w+']);
  3. Route::rule('new/:id','index/article/details','get',['id'=>'\w+']);

如果一个变量同时定义了全局规则和局部规则,局部规则会覆盖全局变量的定义。

批量注册

  1. Route::rule([
  2. '路由规则1'=>'路由地址和参数',
  3. '路由规则2'=>['路由地址和参数','匹配参数(数组)',
  4. '变量规则(数组)']
  5. ...
  6. ],'','请求类型','匹配参数(数组)','变量规则');

定义路由配置文件

除了支持动态注册,也可以直接在应用目录下面的route.php 的最后通过返回数组的方式直接定义路由规则

  1. return [
  2. 'new/:id' => 'News/read',
  3. ];

默认情况下,只会加载一个路由配置文件route.php,如果你需要定义多个路由文件,可以修改route_config_file配置参数

默认情况下,只会加载一个路由配置文件route.php,如果你需要定义多个路由文件,可以修改route_config_file配置参数

完整URL规则

如果要对整个URL进行规则检查,可以进行__url__ 变量规则,例如:

  1. // 定义GET请求路由规则 并设置完整URL变量规则
  2. Route::get('new/:id','News/read',[],['__url__'=>'new\/\d+$']);

路由别名

路由别名功能可以使用一条规则,批量定义一系列的路由规则。

  1. // user 别名路由到 index/User 控制器
  2. Route::alias('user','index/User');

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/351329
推荐阅读
相关标签
  

闽ICP备14008679号