路由在框架中的做用打个比方的话,路由比如是WEB应用的总调度室,对于访问的URL地址,路由能够拒绝或者接受某个URL请求,并进行分发调度,并且还有一个反作用是由于路由规则能够随意定义,所以可让你的URL请求地址更优雅,由于不会暴露实际的URL地址,也就意味着更安全,5.0的路由不只仅只是支持路由到控制器的操做方法,甚至能够路由到任何的类或者闭包。php
一、路由模式thinkphp
路由能够理解为一种寻径功能模块,好比URL地址里面的index模块怎么才能省略呢,默认的URL地址显得有点长,下面就来讲说如何经过路由简化URL访问。ThinkPHP5.0的路由比较灵活,而且不须要强制定义,能够总结概括为以下三种方式:安全
1.1、普通模式闭包
关闭路由,彻底使用默认的PATH_INFO方式URL:app
'url_route_on' => false,
路由关闭后,不会解析任何路由规则,采用默认的PATH_INFO 模式访问URL:框架
http://serverName/index.php/module/controller/action/param/value/...
但仍然能够经过操做方法的参数绑定、空控制器和空操做等特性实现URL地址的简化。post
能够设置url_param_type
配置参数来改变pathinfo模式下面的参数获取方式,默认是按名称成对解析,支持按照顺序解析变量,只须要更改成:学习
// 按照顺序解析变量 'url_param_type' => 1,
1.二、混合模式网站
开启路由,并使用路由定义+默认PATH_INFO方式的混合:url
'url_route_on' => true, 'url_route_must'=> false,
该方式下面,只须要对须要定义路由规则的访问地址定义路由规则,其它的仍然按照第一种普通模式的PATH_INFO模式访问URL。
1.三、强制模式
开启路由,并设置必须定义路由才能访问:
'url_route_on' => true, 'url_route_must' => true,
这种方式下面必须严格给每个访问地址定义路由规则(包括首页),不然将抛出异常。
首页的路由规则采用/
定义便可,例以下面把网站首页路由输出Hello,world!
Route::get('/',function(){ return 'Hello,world!'; });
二、路由配置
2.1、
URL请求的执行流程:用户请求 -> 路由解析 -> 调度请求 -> 执行操做 -> 响应输出
2.二、路由规则写在哪里:
* 路由规则写在与应用配置统计的route.php文件中
* 路由规则主要使用路由类Route::rule()方法注册
2.3、
设置路由配置文件列表:
'route_config_file' => ['home','admin'],
application/home.php
配置home
模块的路由规则,application/admin.php
则配置admin
模块的路由规则。
虽然运行的时候依然会同时加载并注册,但定义的时候是明确分开了,便于协做。
三、路由注册
路由注册能够采用方法动态单个和批量注册,也能够直接定义路由定义文件的方式进行集中注册。
3.一、动态注册和静态路由
如今给该URL地址定义一个新的路由规则以下:
Route::rule('hello/:name','index/Index/hello');
如今咱们来分析下rule
方法的参数,第一个参数称为路由规则(经过路由访问的地址),第二个参数为该规则对应的路由地址(也就是原来定义路由以前访问的URL地址)。
路由规则一般能够包含变量(例如其中的:name
就是一个路由变量),路由规则中包含变量(包括可选变量)的就称该条路由规则为动态路由,没有包含任何变量的路由咱们称之为静态路由,例如:
// 静态路由规则 Route::rule('hello','index/Index/hello'); // 动态路由规则 Route::rule('hello/:name','index/Index/hello');
注:ThinkPHP5.0的路由规则定义是从根目录开始,而不是基于模块名的。而且原来的访问地址会自动失效。
3.二、URL请求类型
咱们知道一个URL请求类型有不少,经常使用的包括GET
/ POST
/ PUT
/ DELETE
等,咱们使用rule
方法注册的路由,默认是支持任意请求类型访问的,不过你能够经过第三个参数来限定请求类型:
Route::rule('hello/:name','index/index/hello','GET');
注:只有经过GET
请求的访问,该路由才会生效。不指定的话默认为任何请求类型
若是你但愿路由能够支持全部的请求类型,也可使用:
Route::any('hello/:name','index/index/hello');
注:any
方法其实和rule
方法是同样的,区别在于不用写第三个参数。
系统提供了为不一样的请求类型定义路由规则的简化方法,例如:
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'); // 全部请求都支持的路由规则
咱们也能够批量注册路由规则,例如:
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']);
四、路由表达式
路由表达式统一使字符串定义,采用规则定义的方式。
4.一、规则表达式
规则表达式一般包含静态地址和动态地址,或者两种地址的结合,例以下面都属于有效的规则表达式:
'/' => 'index', // 首页访问路由 'my' => 'Member/myinfo', // 静态地址路由 'blog/:id' => 'Blog/read', // 静态地址和动态地址结合 'new/:year/:month/:day'=>'News/read', // 静态地址和动态地址结合 ':user/:blog_id'=>'Blog/read',// 全动态地址
每一个参数中以“:”开头的参数都表示动态变量,而且会自动绑定到操做方法的对应参数。
4.二、路由变量
支持对路由参数的可选定义,例如:
'blog/:year/[:month]'=>'Blog/archive',
[:month]
变量用[ ]
包含起来后就表示该变量是路由匹配的可选变量。
4.三、变量解析方式
路由规则以外的变量解析方式通常是key1/value1/key2/value2
解析为key1=value1
,key2=value2
,也就是说
http://tp5.com/hello/thinkphp/city/shanghai
除了会解析路由变量name
以外,还会解析另一个city
变量,分别是:
'name' => 'thinkphp', 'city' => 'shanghai'
固然咱们能够设置按顺序解析:
'url_param_type' => 1
这个时候若是访问http://tp5.com/hello/thinkphp/city/shanghai,获得的变量结果就彻底不一样了:
'name' => 'thinkphp', 0 => 'city', 1 => 'shanghai',
4.四、定制分隔符
咱们在定义路由规则的时候,都是统一使用/
做为URL分隔符,但并非表示URL访问的时候只能使用/
做为分隔符,例如咱们能够设置参数:
'pathinfo_depr' => '-',
那么URL访问地址就会变成
http://tp5.com/hello-thinkphp http://tp5.com/hello-thinkphp-beijing
若是你但愿某个路由地址使用不一样的URL分隔符,有两种方法:
方法一:param_depr
先介绍第一种比较简单的,定义路由规则的时候,添加param_depr
参数(要求V5.0.2+
),例如:
Route::get('hello/:name/[:city]','index/index/hello',['param_depr' => '-'],[ 'name' => '\w+' , 'city' => '[A-Za-z]+' ]);
表示只有在该路由规则访问的时候,才使用-
做为url分隔符。
方法二:组合变量
在一些复杂的路由规则定义中,咱们可使用组合变量定义方式,组合变量的优点是变量分隔符能够随意定义,例如:
//正确路径:http://www.mtp5.com/test/1;注:‘?《name?》’表示可选的,['index/index2/test', []]里面的‘[]’是必须的 'test/<id?>-?<name?>' =>['index/index2/test', []] //正确路径:http://www.mtp5.com/test-1 'test-<id>-?<name?>' =>['index/index2/test', []] //正确路径:http://www.mtp5.com/test-1- 'test-<id>-<name?>' =>['index/index2/test', []] //正确路径:http://www.mtp5.com/test/1- 'test/<id>-<name?>' =>['index/index2/test', []] //正确路径:http://www.mtp5.com/test1 'test?<id?>-?<name?>' =>['index/index2/test', []] //正确路径:http://www.mtp5.com/test 'test-?<id?>-?<name?>' =>['index/index2/test', []]
错误的写法:
//错误写法 'test/?<id?>-?<name?>' =>['index/index2/test', []] 'test/[:id]-?<name?>' =>['index/index2/test', []]
注:<name?>表示可选变量,'?<name?>'表示前面的分隔符和这个变量都是可选的
经过本篇内容的学习,你已经掌握了路由变量的使用,下面是路由变量的对比
变量定义 | 必须变量 | 可选变量 | 变量分隔符 |
---|---|---|---|
普通变量 | :name |
[:name] |
/ |
组合变量 | <name> |
<name?> |
实际URL分隔符 |
4.五、完整匹配
规则匹配检测的时候只是对URL从头开始匹配,只要URL地址包含了定义的路由规则就会匹配成功,若是但愿彻底匹配,能够在路由表达式最后使用$
符号,例如:
//正确的写法
'new/:cate$'=> 'News/category',//路径:http://serverName/index.php/new/info
'hello/[:name]$' => 'index/hello',
//错误的写法'url/[:id]/[:name$]' => 'index/index2/url',