ThinkPHP 5采用的默认规则是PATHINFO模式,也就是如下的URL形式:
http://server/module/controller/action/param/value/
与ThinkPHP 3最大的不同是ThinkPHP 5的路由更加灵活,支持路由到模块的控制器/操作、控制器类的方法、闭包函数和重定向地址,甚至是任何类库的方法。
需要注意的是,ThinkPHP 5的路由是针对应用而不是模块,所以路由是针对某个应用下的所有模块。如果需要按照模块定义路由,就需要自定义如下入口文件:
ThinkPHP 5的路由通过url_route_on和url_route_must来控制路由行为。根据这两个配置,存在三种路由模式:普通模式、混合模式和强制模式。
禁用路由,系统按照PATHINFO模式解析请求:'url_route_on' => false,
系统按照PATHINFO模式+路由定义解析请求:
'url_route_on' => true,
'url_route_must'=> false,
若定义了路由,则执行路由,否则按照PATHINFO解析。
该模式下所有请求必须设置路由,否则抛出异常:
'url_route_on' => true,
'url_route_must' => true,
顾名思义,就是使用硬编码的形式进行定义(区别于配置式定义)。一般路由定义在application/route.php文件中,注册形式如下:
Route::rule('路由表达式','路由地址','请求方法','路由条件','变量规则');
例如,下面的注册代码将会使访问“/news/”新闻ID的链接路由到index模块的News控制器的read方法:
Route::rule('news/:id','index/News/read');
由于ThinkPHP 5的路由是针对所有模块的,所以定义的时候需要加上模块名。
ThinkPHP 5支持GET、POST、PUT、DELETE以及任意(*)请求方法定义。系统内置以下方法来简化路由定义:
Route::get('news/:id','News/read'); // GET
Route::post('news/:id','News/update'); // POST
Route::put('news/:id','News/update'); // PUT
Route::delete('news/:id','News/delete'); // DELETE
Route::any('new/:id','News/read'); //任意请求方法
如果一个路由可以同时支持多种请求方法,可以使用“|”符号,意思和“或”一致。例如,有如下定义:
Route::rule('news/:id','index/News/read', 'GET|POST');
则该路由允许POST和GET请求方法访问。
通过返回数组来定义路由,而且可以批量定义,简化代码编写量。该定义方式和ThinkPHP 3很相似,但是不支持正则定义。例如:
<?php
return [
// 首页路由到index模块index控制器的index方法
'/' => 'index/index/index',
'news/:id' => 'index/News/read', // 变量定义
'news/[:id]' => 'index/news/read', // 可选变量定义
'news/:id$' => 'index/news/read', // 完全匹配
'user/:id' => 'index/user/show?status=1', // 传递隐式参数
// 限制变量类型
'post/:id'=> ['index/post/show',['ext'=>'html'],['id'=>'\d{4}']],
];