我是靠谱客的博主 岁月静好,这篇文章主要介绍tp5的路由,现在分享给大家,希望可以做个参考。

路由模式:普通、强制和混合

普通模式:

复制代码
1
2
//配置文件关闭路由,完全使用默认的PATH_INFO方式URL 'url_route_on'  =>  false,

关闭路由后的普通模式任然可以通过操作方法的参数绑定、控制器和空操作等特性实现url地址的简化

强制模式:

复制代码

复制代码
1
2
3
4
5
6
7
8
9
10
//配置文件如下配置 'url_route_on'          =>  true, 'url_route_must'        =>  true, //这种方式下面必须严格给每一个访问地址定义路由规则(包括首页),否则将抛出异常。 //首页的路由规则采用/定义即可,例如下面把网站首页路由输出Hello,world! Route::get('/',function(){     return 'Hello,world!'; });

复制代码

 

混合模式:

复制代码
1
2
3
4
5
//开启路由,并使用路由定义+默认PATH_INFO方式的混合 //配置如下 'url_route_on'  =>  true, 'url_route_must'=>  false, //该方式下面,只需要对需要定义路由规则的访问地址定义路由规则,其它的仍然按照第一种普通模式的PATH_INFO模式访问URL

动态注册和路由配置两种方式

由于检测机制问题,动态注册的性能比路由配置要高一些,尤其是多种请求类型混合定义的时候。

动态注册:

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

复制代码
1
请求类型不指定的话默认为任何请求类型包含(GET、POST、PUT、DELETE、*表示任何其他请求)

复制代码

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
单个注册: Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)'); 批量注册: Route::rule(     [         '路由规则1'=>'路由地址和参数',         '路由规则2'=>['路由地址和参数','匹配参数(数组)','变量规则(数组)']     ],     '',     '请求类型',     '匹配参数(数组)',     '变量规则' ); Route::rule(     [         'new/:id'  =>  'News/read',         'blog/:id' =>  ['Blog/update',['ext'=>'shtml'],['id'=>'d{4}']         ],     ],     '',     'GET',     ['ext'=>'html'],     ['id'=>'d+'] ); 路由地址:
复制代码
1
//多级控制
复制代码
1
'blog/:id'=>'index/group.blog/read',//路由到index/controller/group/Blog
复制代码
1
 

复制代码

 

复制代码

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Route::rule(     'theme/:id/[:name]',     'home/Goods/theme',     'GET',     [         'method'=>'POST|GET|PUT',//请求类型检测         'ext'=>'shtml|html|php',//检测是shtml|html|php这三个后缀的请求就通过         'deny_ext'=>'jpg|png|gif',//URL禁止后缀检测,这里禁止检测jpg|png|gif者三个后缀         'domain'=>'news.thinkphp.cn',//子域名检测则直接news就行'domain'=>'news']         'https'=>true,//检测是否https请求         'before_behavior'=>'appindexbehaviorUserCheck',//前置行为(检测)         'after_behavior'=>'appindexbehaviorReadInfo',//后置行为(执行)         'callback'=>'my_check_fun',//自定义检测方法         'merge_extra_vars'=>true,//合并额外参数         'cache'=>3600,//请求缓存V5.0.1+         'bind_model'=>['User','name'],//绑定模型V5.0.1+         'param_depr'=>'',//路由参数分隔符V5.0.2+         'ajax'=>true,//V5.0.2+         'pjax'=>true,//V5.0.2+     ],     ['name'=>'w+','id'=>'d+'] );

复制代码

 

 

规则表达式

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

复制代码
1
2
3
4
5
Route::rule('/', 'index'); // 首页访问路由 Route::rule('my', 'Member/myinfo'); // 静态地址路由 Route::rule('blog/:id', 'Blog/read'); // 静态地址和动态地址结合 Route::rule('new/:year/:month/:day', 'News/read'); // 静态地址和动态地址结合 Route::rule(':user/:blog_id', 'Blog/read'); // 全动态地址

当控制器文件不再controler文件夹下而是在controller子文件夹下时我们定义路由地址格式为[子文件名.  控制器名]

如:

复制代码

复制代码
1
2
3
4
5
6
7
//controller/v1/Banner.php  访问为:http://www.localhost/api/v1/banner/1  Route::get("api/v1/banner/:id","api/v1.Banner/getBanner"); //下面是动态调用(如不同版本) Route::get("api/:version/banner/:id","api/:version.Banner/getBanner"); //当前新品 Route::get("api/:version/product/recent","api/:version.Product/getRecent");

复制代码

 

ThinkPHP5.0的路由规则定义是从根目录开始,而不是基于模块名的。

application/route.php注册   然后访问变成http://serverName/new/5

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

不同的请求类型定义路由规则的简化方法:请求类型参数必须大写

复制代码

复制代码
1
2
3
4
5
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'); // 所有请求都支持的路由规则
复制代码
1
2
//如果要定义get和post请求支持的路由规则,也可以用: Route::rule('new/:id','News/read','GET|POST');

复制代码

参数可选定义

复制代码
1
2
3
4
5
Route::get('blog/:year/[:month]','Blog/archive'); //变量用 [ ] 包含起来后就表示该变量是路由匹配的可选变量 下面的URL访问地址都可以被正确的路由匹配: http://serverName/index.php/blog/2015 http://serverName/index.php/blog/2015/12

路由标志:设置一个唯一的用于url生成的字符

复制代码

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 注册路由到index模块的News控制器的read操作 Route::name('new_read')->rule('new/:id','index/News/read'); //生成路由地址的时候就可以使用 url('new_read',['id'=>10]); //如果不定义路由标识的话,使用下面的方式生成 url('index/News/read',['id'=>10]); V5.1.6+ 版本开始,路由标识的用法调整,原来的用法: // 注册路由到index模块的News控制器的read操作 Route::name('new_read')->rule('new/:id','index/News/read'); 需要改为: // 注册路由到index模块的News控制器的read操作 Route::rule('new/:id','index/News/read')->name('new_read'); 因为后者更符合语义。

复制代码

 

 

 

 

 

路由别名:Route::alias('别名','模型/控制器');

复制代码

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
use thinkRoute; Route::alias('home','index/index'); Route::alias('admin','admin/index'); 或者: return [     '__alias__' =>  [         'home'  =>  'index/index',        'admin'=> 'admin/index'     ], ];

复制代码

 

复制代码

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
use thinkRoute; // 注册路由到index模块的News控制器的read操作 Route::rule('show/:id','test/Index/index');//id必须 Route::rule('show/[:id]','test/Index/index');//id可选 Route::rule('new/:id','News/update','POST');//第三个参数为空则表示接受所有的请求类型的参数 //完全匹配 Route::rule('show/:id$','test/Index/index');//只有http://www.admindemo2.com/show/2才能访问而去掉$的话http://www.admindemo2.com/show/2/3/tom/...也能通过 //全局完全匹配(开启全局完全匹配后所有的都不用再加$) //配置文件添加 //'route_complete_match'  =>  true,//开启路由定义的全局完全匹配 //当开启全局完全匹配的时候,如果个别路由不需要使用完整匹配,可以添加路由参数覆盖定义: //Route::rule('new/:id','News/read','GET|POST',['complete_match' => false]); Route::get('routeget','test/Index/routeGet'); // 定义GET请求路由规则,同Route::rule('routeget','test/Index/routeGet','GET');//只接受get的请求 Route::get('routeget/:id','test/Index/routeGet'); // 同//Route::rule('routeget/:id','test/Index/routeGet','GET');//只接受get的请求 //注意: Route::get('routeget','test/Index/routeGet');与Route::get('routeget/:id','test/Index/routeGet');同时定义相当于Route::get('routeget/[:id]]','test/Index/routeGet');文档说明:注册多个路由规则后,系统会依次遍历注册过的满足请求类型的路由规则,一旦匹配到正确的路由规则后则开始调用控制器的操作方法,后续规则就不再检测 所以为了避免冲突最好将优先级高的放在最前面(比如单个设置的变量规则和路由规则放前面,全局的放在最后面) Route::rule('routepost','test/Index/routePost','POST');//post的请求才能接受 Route::rule('routepostorget','test/Index/routePostOrGet','POST|GET');//只接受get和post请求,其他一律不接受 // 定义new路由命名标识 Route::rule(['name','routenameflag/:id'],'test/Index/routeNameFlag'); //http://www.admindemo2.com/routenmeflag/1 //{:url('name',['id'=>1])} Route::rule(['name2','routenameflag2/'],'test/Index/routeNameFlag2');//第二个参数有没有/都无所谓 //http://www.admindemo2.com/routenmeflag2 or //http://www.admindemo2.com/routenmeflag2/ //{:url('name2')} Route::rule(['name3','routenameflag3/[:id]'],'test/Index/routeNameFlag3'); //http://www.admindemo2.com/routenmeflag3 or //http://www.admindemo2.com/routenmeflag3/1 //{:url('name3')} or //{:url('name',['id'=>1])} //批量注册: Route::rule(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']); Route::get(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']); /* Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)'); Route::rule(     [         '路由规则1'=>'路由地址和参数',         '路由规则2'=>['路由地址和参数','匹配参数(数组)','变量规则(数组)']     ],     '',     '请求类型',     '匹配参数(数组)',     '变量规则' ); */ Route::rule(     [         'new/:id'  =>  'News/read',         'blog/:id' =>  ['Blog/update',['ext'=>'shtml'],['id'=>'d{4}']],         ':action/blog/:id' => 'index/blog/:action',// action变量的值作为操作方法传入         ':c/:a'=> 'index/:c/:a',// 变量传入index模块的控制器和操作方法         ],     '',     'GET',     ['ext'=>'html'],     ['id'=>'d+'] ); //变量规则 //1、设置单个路由全局的变量规则 Route::rule('new/:tittle','News/update'); // 设置tittle变量规则(采用正则定义) Route::pattern('name','w+'); //2、批量设置路由全局规则 Route::rule('new/:tittle','News/update'); Route::rule('banner/:id','home/Goods/banner'); Route::pattern([     'tittle'  =>  'w+',     'id'    =>  'd+', ]); //3、设置局部变量规则,仅在当前路由有效 Route::get('new/:name','News/read',[],['name'=>'w+']); //4、完整URL规则 Route::get('allurl/:catergory','test/Index/allUrl',[],['__url__'=>'allurl/[A-Za-z0-9]{1,}$']);//id必须 //组合变量 //http://www.admindemo2.com/item-sb or http://www.admindemo2.com/item-sb555  or http://www.admindemo2.com/item-sb555a /*Route::get('item-<name><id?>','test/Index/product',[],['name'=>'w+','id'=>'d+']);*/ // http://www.admindemo2.com/item-sb-555 Route::get('item-<name>-<id>','test/Index/product',[],['name'=>'w+','id'=>'d+']); Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)'); Route::rule(     'theme/:id/[:name]',     'home/Goods/theme',//路由地址     'GET',     [         'method'=>'POST|GET|PUT',//请求类型检测         'ext'=>'shtml|html|php',//检测是shtml|html|php这三个后缀的请求就通过         'deny_ext'=>'jpg|png|gif',//URL禁止后缀检测,这里禁止检测jpg|png|gif者三个后缀         'domain'=>'news.thinkphp.cn',//子域名检测则直接news就行'domain'=>'news']         'https'=>true,//检测是否https请求         'before_behavior'=>'appindexbehaviorUserCheck',//前置行为(检测)         'after_behavior'=>'appindexbehaviorReadInfo',//后置行为(执行)         'callback'=>'my_check_fun',//自定义检测方法         'merge_extra_vars'=>true,//合并额外参数         'cache'=>3600,//请求缓存V5.0.1+         'bind_model'=>['User','name'],//绑定模型V5.0.1+         'param_depr'=>'',//路由参数分隔符V5.0.2+         'ajax'=>true,//V5.0.2+         'pjax'=>true,//V5.0.2+     ],     ['name'=>'w+','id'=>'d+'] ); //路由地址 //1、额外参数: Route::get('extraparams/:id','test/Index/extraParam?status=1&app_id=5');  // http://www.admindemo2.com/extraparams/2/3  访问 // Request::instance()->route()能获取到id、status、app_id //2 路由到模块/控制器   [模块/控制器/]操作?参数1=值1&参数2=值2... //2.1 路由到默认或者绑定模块 Route::rule('blog/:id','index/read'); //2.2 路由到index模块 Route::rule('blog/:id','test/index/read'); //2.3、路由到动态的模块、控制器或者操作 //http://www.admindemo2.com/moviemodel/index/1  访问到的是test/Index/movieModel() Route::rule(':action/index/:id','test/Index/:action'); //http://www.admindemo2.com/moviemodel/lichihua/1  访问到的是test/Index/movieModel() Route::rule(':action/lichihua/:id','test/Index/:action'); //4 路由到操作方法  @[模块/控制器/]操作 //'blog/:id'=>'@index/blog/read',   系统会直接执行 Loader::action('index/blog/read'); //这种方式看起来似乎和第一种是一样的,本质的区别是直接执行某个控制器类的方法,而不需要去解析 模块/控制器/操作这些,同时也不会去初始化模块,视图的默认模板规则失效,所以这种情况下面,如果使用了视图模板渲染,则必须传入明确的参数 Route::get('test/:id','@test/Index/dongTest?status=1'); //?? //路由到类的方法     路由地址的格式为(动态方法):类的命名空间类名@方法名  或者(静态方法):类的命名空间类名::方法名 //可以支持执行任何类的方法,而不仅仅是执行控制器的操作方法 Route::rule('blog/:id','appindexserviceBlog@read');//执行的是 appindexserviceBlog类的read方法 Route::rule('blog/:id','appindexserviceBlog::read'); //V5.0.4+版本开始,支持传入额外的参数作为方法的参数调用(用于参数绑定),例如: Route::rule('blog/:id','appindexserviceBlog::read?status=1'); //路由到重定向地址  以/或者http 开头 Route::rule('wolichihua/:id','/test/:id'); //http://www.admindemo2.com/wolichihua/1  访问到了est/Index/dongTest即上面定义的test/:id' //资源路由 //在指向index模块的blog控制器新建index()、create($id)、save、read($id)、eidit($id)、update($id)、delete($id)方法然后动态注册(资源路由会自动注册7个路由规则分别对应这几个方法) 详情参考资源路由 Route::resource('blog','index/blog'); //或者路由配置 return [     // 定义资源路由     '__rest__'=>[         // 指向index模块的blog控制器         'blog'=>'index/blog',     ],     // 定义普通路由     'hello/:id'=>'index/hello', ]; //快捷路由  Route::controller('user','模块/控制器'); // 给User控制器设置快捷路由  控制器方法为 请求类型+方法名  如getInfo()与postInfo() // get http://localhost/user/phone   post http://localhost/user/info Route::controller('user','index/User'); //路由别名 //我们希望使用user可以访问Home模块的User控制器的所有操作  那么我么定义别名为 Route::alias('user','home/User'); //或者 return [     '__alias__' =>  [         'user'  =>  'home/User',     ], ]; //路由别名可以指向任意一个有效的路由地址,例如下面指向一个类 // user 路由别名指向 User控制器类 Route::alias('user','appindexcontrollerUser'); //路由分组  允许把相同前缀的路由定义合并分组 Route::group('blog',[     ':id'   => ['Blog/read', ['method' => 'get'], ['id' => 'd+']],     ':name' => ['Blog/read', ['method' => 'post']], ],['ext'=>'html']); //MISS路由:没有匹配到所有的路由规则后执行一条设定的路由,可以使用MISS路由功能, MISS路由配置后相当于开启了强制路由 //全局MISS路由    //Route::miss(); 放到路由的第一行才能生效,放到最后一行或者return里面不生效????? Route::miss('public/miss');//当没有匹配到所有的路由规则后,会路由到 public/miss路由地址。 //分组MISS路由  分组支持独立的MISS路由 // // //闭包支持: Route::get('hello/:name',function($name){      return 'Hello,'.$name; }); //闭包还支持模板师视图 Route::get('/', function () {     return view('admin@home/index'); }); //路由绑定 // 绑定当前的URL到 index模块 Route::bind('index'); // 绑定当前的URL到 index模块的blog控制器 Route::bind('index/blog');//http://serverName/index/blog/read/id/5可以简化成http://serverName/read/id/5 ;如果定义了路由Route::get('index/blog/:id','index/blog/read');那么访问URL就变成了http://serverName/5 // 绑定当前的URL到 index模块的blog控制器的read操作 Route::bind('index/blog/read'); // 绑定命名空间 Route::bind('appindexcontroller','namespace');//通过http://serverName/blog/read/id/5就可以直接访问 appindexcontrollerBlog类的read方法。 // 绑定到类 Route::bind('appindexcontrollerBlog','class');//通过http://serverName/read/id/5就可以直接访问 appindexcontrollerBlog类的read方法。 //入口文件绑定 // 复制一份入口文件添加define('BIND_MODULE','admin'); 命名为demo.php 我们访问这个demo.php就访问的是admin模块 // 自动入口绑定 // 配置文件开启入口文件自动绑定模块   'auto_bind_module'  =>  true, //复制一份index.php 改名为demo.php  访问index.php是访问index模块 访问的demo.php则访问得是demo模块 //域名路由   省略

复制代码

 

 

定义路由后参数的获取问题:

复制代码

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Route::get('hello/:id','index/test/hello'); 以下三种是获取不到值的: dump(request()->get()); dump(request()->get('id')); dump(input('get.id')); 我们只有通过:下面这几个才能获取到 dump(request()->param()); dump(request()->param('id')); dump(request()->route()); dump(request()->route('id')); 怎么才能让get获取到? 参数绑定和?后面的如: public function hello($id){     dump(request()->get());     dump(input('get.')); } 浏览器输入:域名/hello/10?name=123 array (size=2)   'name' => string '123' (length=3)   'id' => string '10' (length=2)

复制代码

路由之后这些方法的controller和action的的值与实际的不同了

复制代码

复制代码
1
2
3
4
5
6
7
8
11.// 调用Request对象的path方法 12.{$Request.path} 13.// 调用Request对象的module方法 14.{$Request.module} 15.// 调用Request对象的controller方法 16.{$Request.controller} 17.// 调用Request对象的action方法 18.{$Request.action}


最后

以上就是岁月静好最近收集整理的关于tp5的路由的全部内容,更多相关tp5内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(916)

评论列表共有 0 条评论

立即
投稿
返回
顶部