thinkphp——路由

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41179401/article/details/86538821

路由功能由\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,

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

路由定义采用\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');

猜你喜欢

转载自blog.csdn.net/qq_41179401/article/details/86538821
今日推荐