路由
官方文档里面是这样子定义的=>路由的作用是简化URL访问地址,并根据定义的路由类型做出正确的解析。
- 手动解释一下:
- 平常我们按照习惯去访问我们的ThinkPHP项目的时候,常规的url应该是这样子写的,(本地举例)http://localhost/项目名/public/index.php/模块名/控制器名/方法名
一串url输进去之后,就会感觉很绝望,(小声吐槽)=>“我只是想测试一个小接口让我打这么长一串地址、地址太长记不住呀……”。这个时候我们就可以用路由去简化他的地址,并且在缩短地址的同时进行一些规则的定义。
- 路由的作用:
- 简化URL地址,方便大家记忆
- 有利于搜索引擎的优化,比如可以被百度的爬虫抓取到
- 路由的三种模式:
- 普通模式 :完全使用PASH_INFO来访问,比如http://www.yd.com/index.php/index/index,域名+模块+控制器
- 混合模式 :可以使用路由也可以不使用
- 强制模式 :必须使用路由
注意:路由只针对应用,不针对模块,如果有些模块不像使用路由,需要在配置文件中关闭路由
1 | //关闭admin模块的路由,必须写到加载框架引导文件之后 |
1.普通模式:完全使用PASH_INFO来访问
1 | // 是否开启路由 |
2.混合模式
1 | // 是否开启路由 |
3.强制模式
1 | // 是否开启路由 |
设置路由:
一下直接修改application下的route.php
1.单个注册
在application下的route.php文件内更改
1 | use think\Route; //引入Route |
路由形式:
- 静态路由:
Route::rule(‘/’,’index/index/index’);
Route::rule(‘test’,’index/index/test’); - 带参数的路由: Route::rule(‘time/:time’,’index/User/getTime’);
http://com.test.php:8888/getTime/123456 - 可选参数的路由: Route::rule(‘time/[:time]/[:???]’,’index/User/getTime’);
http://com.test.php:8888/getTime
http://com.test.php:8888/getTime/123456 - 全动态路由(不推荐): Route::rule(‘:X/:Y’,’index/User/getXY’);
http://com.test.php:8888/11/22 - 完全匹配:Route::rule(‘rout$’=>’index/User/getRout’);
不加$符号,我们字comp后面加多少路径,比如http://com.test.php:8888/comp/asd/dfds/wer/ewr,页面都能输出 我是完全匹配路由 Route::rule(‘rout’,’index/User/getRout’);
加上$符号,我们在comp后面加多少路径,比如http://com.test.php:8888/comp/comp/asd/dfds/wer/ewr,页面不能输出方法的内容 - 额外参数:Route::rule(‘test’,’index/index/test?id=1&name=icocos’);
2.批量注册
- rule方式
1 | Route::rule([ "test"=>"index/index/test", 'time/:time'=>'index/User/getTime' ],'','get'); //post,put,delete |
- get方式
1 | Route::get([ "test"=>"index/index/test", 'time/:time'=>'index/User/getTime' ]); //post,put,delete |
3.配置文件注册
1 | return[ "test"=>"index/index/test", 'time/:time'=>'index/User/getTime']; |
路由的请求方式
一般请求方式有八种,但是TP里面有四种请求方式(GET,POST,PUT,DELETE),其中GET,POST是最常用的,如果我们不指定请求类型,默认是*,所有的请求类型
- 支持get
1 | Route::rule('rtype','index/User/getRType','get'); |
- 支持post
1 | Route::post('rtype','index/User/getRType'); |
- 既支持get有支持post
1 | Route::rule('rtype','index/User/getRType','get|post'); |
- 支持全部请求方式
1 | Route::any('rtype','index/User/getRType'); |
模拟PUT,DELETE
- 支持put请求
1 | Route::put('rtype','index/User/getRType'); |
- 支持put请求
1 | Route::delete('rtype','index/User/getRType'); |
变量规则
- Route::rule();的最后一个参数,是一个数组,可以指定多个参数,用正则表达式来写,用来规范传入的参数必须是什么数据类型,或者必须是那些数据等等,比如
1 | Route::rule('getid/:id','index/User/getId','get',[],['id'=>'\d']); //最后一个参数,表示id传参数必须是数字 |
路由参数
- Route::rule();的倒数第二个参数,是一个数组,可以用来指定请求的数据类型,也可以用来规定请求的URL后缀,比如
1 | Route::rule('getid/:id','index/User/getId','get',['method'=>'get','ext'=>'html'],['id'=>'\d']); |
资源路由
你的后台模块可能会有增删改查等操作,但是一个一个写太费劲,资源路由自动帮你生这些路由,你只需要在控制器内写这些方法,
设置后会自动注册7个路由规则,如下:
1 | 标识 请求类型 生成路由规则 对应操作方法(默认) |
实战
1 | //先创建block |
效果:
1 | //当你访问http://com.test.php:8888/block URL访问的是index方法 |
快捷路由
在index模块下创建一个Fastroute控制器,里面写下如下例子,除了index,其他方法都要加上get
1 | namespace app\index\controller; |
在route.php里面写下快捷路由
1 | //注意:路由名字要和控制器名字一样 |
生成URL:
- 有两种方式
1 | Url::build(‘index/User/index’); |
查看生成方式
1 | dump(url('index/User/index')); |
- 带参数
1 | url('index/User/index/id/10'); |
- 带锚点
1 | url('index/User/index/abc#name', 'id=10&name=icocos'); |
- 带域名
1 | url('index/User/index/abc#name@blog', 'id=10&name=icocos'); |
加入口文件
1 | Url::root('/index.php'); //带入口文件 |