ThinkPHP5.0路由之路由注册
路由
路由功能由\think\Route类完成
概述
由Think PHP5.0默认采用的URL规则是:
http://server/sodule/controller/action/param/value/.....
路由的作用是简化URL访问地址,并根据定义的路由类型做出正确解析。
路由模式
ThinkPHP5.0的路由比较灵活,并且不需要强制定义,可总结为以下三种方式:
一,普通模式
关闭路由,完全使用默认的PATH_INFO 访问URL;
url_route_on =>false,
路由关闭后,不会解析任何路由规则,采用默认的PATH_INFO模式 访问URL;
http://server/Name/index.php/module/controller/action/param/value/.....
二、混合模式
开启路由后并使用路由定义+默认PATH_INFO方式的混合
url_route_on =>true,
url_route_must =>false,
该方法下面,只需要对需要定义路由规则的访问地址定义路由规则,其他的仍然按照第一种普通模式的PATH_INFO 模式访问URL.
三、强制模式
开启路由,并设置必须定义路由才能访问:
url_route_on =>true,
url_route_must =>true,
这种方式必须严格给每一个访问地址定义路由规则(包括首页),否则将抛出异常。
首页的路由规则采用/定义即可,例如下面把网站首页由输出Hello,world!我们现需要在route.php这个文件中配置路由,要使用官方的use think\Route
Route::get( '/' ,function(){
return 'Hello,world!';
} );
则打开tp5进行访问的就是hello world!
路由定义
注册路由规则
路由注册可以采用方法动态单个和批量注册,也可以直接定义路由定义文件的方式进行集中注册。
动态注册
路由定义采用\think\Route
类的rule
方法注册,通常是在应用的路由配置文件application/route.php
进行注册,格式是:
use think\Route; //调用Route类方法
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
并且原来的访问地址会自动失效。
路由表达式(第一个参数)支持定义命名标识,例如:
// 定义new路由命名标识
Route::rule(['new','new/:id'],'index/News/read');
当我们再次到浏览器访问的时候,访问的是list方法(list.html)\
注意,路由命名标识必须唯一,定义后可以用于URL的快速生成。
可以在rule方法中指定请求类型,不指定的话默认为任何请求类型,例如:(第三个请求类型)
Route::rule('new/:id','News/update','POST');
表示定义的路由规则在POST请求下才有效。
请求类型包括: | 类型 | 描述 |
---|---|---|
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'); // 所有请求都支持的路由规则
默认访问read方法
如果要定义get和post请求支持的路由规则,也可以用:
Route::rule('new/:id','News/read','GET|POST');
我们也可以批量注册路由规则,例如:
Route::rule(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']);
Route::get(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']);
Route::post(['new/:id'=>'News/update','blog/:name'=>'Blog/detail']);
注册多个路由规则后,系统会依次遍历注册过的满足请求类型的路由规则,一旦匹配到正确的路由规则后则开始调用控制器的操作方法,后续规则就不再检测。
定义路由配置文件
除了支持动态注册,也可以直接应用目录下面的rote.php的最后通过返回数组的方式直接定义路由规则,内容示例如下:
return [
'new/:id'=> 'index/Index/read',
‘blog/:id' => [ 'Blog/update' ,[ 'method' => 'post|put' ] , [ 'id' => '\d+' ] ],
];
路由动态注册和配置定义的方法可以并存,由于检测机制的问题,动态注册的性能比路由配置更高一些,尤其是多种请求类型混合定义的时候。
默认情况下,只会加载一个路由配置文件route.php,如果需要定义多个路由配置文件,可以修改route_config_file的配置参数,如:
// 路由配置文件(支持配置多个)
'route_config_file' => ['route', 'route1', 'route2'],
时间:2018.4.30