[toc]
概述
由于ThinkPHP5.0默认采用的URL规则是:
路由解析的最终结果通常是把URL地址解析到模块的某个控制器下的操作方法,在特殊的情况下,也可以跳转到外部地址或者执行闭包函数。
新版的路由功能做了大量的增强,包括:
支持路由到模块(模块/控制器/操作)、控制器(控制器类/操作)、类(任何类库);
闭包路由的增强;
规则路由支持全局和局部变量规则定义(正则);
支持路由到任意层次的控制器;
子域名路由功能改进;
路由分组并支持分组参数定义;
通过函数自定义路由检测规则;
ThinkPHP5.0的路由比较灵活,系统支持三种方式的URL解析规则:
一、普通模式
关闭路由,完全使用默认的pathinfo方式URL:
'url_route_on' => false,
路由关闭后,不会解析任何路由规则,采用默认的PATH_INFO 模式访问URL:
module/controller/action/param/value/...
但仍然可以通过Action参数绑定、空控制器和空操作等特性实现URL地址的简化。
二、混合模式
开启路由,并使用路由+默认PATH_INFO方式的混合:
'url_route_on' => true,
该方式下面,只需要对需要定义路由规则的访问地址定义路由规则,其它的仍然按照默认的PATH_INFO模式访问URL。
三、强制模式
开启路由,并设置必须定义路由才能访问:
'url_route_on' => true,
'url_route_must'=> true,
这种方式下面必须严格给每一个访问地址定义路由规则,否则将抛出异常。
首页的路由规则是 /。
注册路由规则
路由功能由think\Route类实现,包括路由注册和检测。
路由注册可以采用方法动态单个和批量注册,也可以直接定义路由定义文件的方式进行集中注册。
动态注册
使用Route类的register方法注册路由规则(通常可以在应用的公共文件中注册,或者定义配置文件后在公共文件中批量导入的方式注册),例如注册如下路由规则后:
\think\Route::register('new/:id','index/New/read');
我们访问:
http://serverName/new/5
ThinkPHP5.0的路由规则定义是从根目录开始,而不是基于模块名的。
其实是访问的:
http://serverName/index/new/read/id/5
可以在register方法中指定请求类型,不指定的话默认为任何请求类型,例如:
\think\Route::register('new/:id','New/update','POST');
表示定义的路由规则在POST请求下才有效。系统提供了为不同的请求类型定义路由规则的简化方法,例如:
\think\Route::get('new/:id','New/read'); // 定义GET请求路由规则
\think\Route::post('new/:id','New/update'); // 定义POST请求路由规则
\think\Route::put('new/:id','New/update'); // 定义PUT请求路由规则
\think\Route::delete('new/:id','New/delete'); // 定义DELETE请求路由规则
\think\Route::any('new/:id','New/read'); // 所有请求都支持的路由规则
如果要定义get和post请求支持的路由规则,也可以用:
\think\Route::register('new/:id','New/read','GET|POST');
我们也可以批量注册路由规则,例如:
\think\Route::register(['new/:id'=>'New/read','blog/:name'=>'Blog/detail']);
\think\Route::get(['new/:id'=>'New/read','blog/:name'=>'Blog/detail']);
\think\Route::post(['new/:id'=>'New/update','blog/:name'=>'Blog/detail']);
注册多个路由规则后,系统会依次遍历注册过的满足请求类型的路由规则,一旦匹配到正确的路由规则后则开始调用控制器的操作方法,后续规则就不再检测。
定义路由配置文件
如果不希望这么麻烦注册路由规则,可以直接在应用目录下面的route.php 直接定义路由规则,内容示例如下:
return [
'__pattern__' => [
'name' => '\w+',
],
'new/:id' => 'New/read',
'[blog]' => [
':id' => ['Blog/read', ['method' => 'get'], ['id' => '\d+']],
':name'