ThinkPHP5——route(路由)的详解
路由在框架中的作用打个比方的话,路由好比是WEB应用的总调度室,对于访问的URL地址,路由可以拒绝或者接受某个URL请求,并进行分发调度,而且还有一个副作用是因为路由规则可以随意定义,因此可以让你的URL请求地址更优雅,因为不会暴露实际的URL地址,也就意味着更安全,5.0的路由不仅仅只是支持路由到控制器的操作方法,甚至可以路由到任何的类或者闭包。
1、路由模式
路由可以理解为一种寻径功能模块,比如URL地址里面的index模块怎么才能省略呢,默认的URL地址显得有点长,下面就来说说如何通过路由简化URL访问。ThinkPHP5.0的路由比较灵活,并且不需要强制定义,可以总结归纳为如下三种方式:
1.1、普通模式
关闭路由,完全使用默认的PATH_INFO方式URL:
'url_route_on' => false,
路由关闭后,不会解析任何路由规则,采用默认的PATH_INFO 模式访问URL:
http://serverName/index.php/module/controller/action/param/value/...
但仍然可以通过操作方法的参数绑定、空控制器和空操作等特性实现URL地址的简化。
可以设置url_param_type配置参数来改变pathinfo模式下面的参数获取方式,默认是按名称成对解析,支持按照顺序解析变量,只需要更改为:
// 按照顺序解析变量
'url_param_type' => 1,
1.2、混合模式
开启路由,并使用路由定义+默认PATH_INFO方式的混合:
'url_route_on' => true,
'url_route_must'=> false,
该方式下面,只需要对需要定义路由规则的访问地址定义路由规则,其它的仍然按照第一种普通模式的PATH_INFO模式访问URL。
1.3、强制模式
开启路由,并设置必须定义路由才能访问:
'url_route_on' => true,
'url_route_must' => true,
这种方式下面必须严格给每一个访问地址定义路由规则(包括首页),否则将抛出异常。
首页的路由规则采用/定义即可,例如下面把网站首页路由输出Hello,world!
Route::get('/',function(){
return 'Hello,world!';
});
2、路由配置
2.1、URL请求的执行流程:用户请求 -> 路由解析 -> 调度请求 -> 执行操作 -> 响应输出
2.2、路由规则写在哪里:
* 路由规则写在与应用配置统计的route.php文件中
* 路由规则主要使用路由类Route::rule()方法注册
2.3、设置路由配置文件列表:
'route_config_file' => ['home','admin'],
application/home.php配置home模块的路由规则,application/admin.php则配置admin模块的路由规则。
虽然运行的时候依然会同时加载并注册,但定义的时候是明确分开了,便于协作。
3、路由注册
路由注册可以采用方法动态单个和批量注册,也可以直接定义路由定义文件的方式进行集中注册。
3.1、动态注册和静态路由
现在给该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.2、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、路由表达式
路由表达式统一使字符串定义,采用规则定义的方式。
4.1、规则表达式
规则表达式通常包含静态地址和动态地址,或者两种地址的结合,例如下面都属于有效的规则表达式:
'/' => 'index', // 首页访问路由
'my' => 'Member/myinfo', // 静态地址路由
'blog/:id' => 'Blog/read', // 静态地址和动态地址结合
'new/:year/:month/:day'=>'News/read', // 静态地址和动态地址结合
':user/:blog_id'=>'Blog/read',// 全动态地址
每个参数中以“:”开头的参数都表示动态变量,并且会自动绑定到操作方法的对应参数。
4.2、路由变量
支持对路由参数的可选定义,例如:
'blog/:year/[:month]'=>'Blog/archive',
[:month]变量用[ ]包含起来后就表示该变量是路由匹配的可选变量。
4.3、变量解析方式
路由规则之外的变量解析方式一般是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.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.5、完整匹配
规则匹配检测的时候只是对URL从头开始匹配,只要URL地址包含了定义的路由规则就会匹配成功,如果希望完全匹配,可以在路由表达式最后使用$符号,例如:
//正确的写法
'new/:cate$'=> 'News/category',//路径:http://serverName/index.php/new/info'hello/[:name]$' => 'index/hello',
//错误的写法
'url/[:id]/[:name$]' => 'index/index2/url',
ThinkPHP5——route(路由)的详解的更多相关文章
- Admin注册和路由分发详解
Admin注册和路由分发详解 1.启动 #autodiscover_modules('admin', register_to=site) 2.注册 1.单例对象 admin.site = AdminS ...
- SPA路由机制详解(看不懂不要钱~~)
前言 总所周知,随着前端应用的业务功能起来越复杂,用户对于使用体验的要求越来越高,单面(SPA)成为前端应用的主流形式.而大型单页应用最显著特点之一就是采用的前端路由跳转子页面系统,通过改变页面的UR ...
- angular4.0 路由守卫详解
在企业应用中权限.复杂页多路由数据处理.进入与离开路由数据处理这些是非常常见的需求. 当希望用户离开一个正常编辑页时,要中断并提醒用户是否真的要离开时,如果在Angular中应该怎么做呢? 其实Ang ...
- ASP.NET MVC5 新特性:Attribute路由使用详解 (转载)
1.什么是Attribute路由?怎么样启用Attribute路由? 微软在 ASP.NET MVC5 中引入了一种新型路由:Attribute路由,顾名思义,Attribute路由是通过Attrib ...
- django中的路由控制详解
一 Django中路由的作用 二 简单的路由配置 三 有名分组 四 路由分发 五 反向解析 六 名称空间 七 django2.0版的path 一 Django中路由的作用 URL配置(URLconf) ...
- ASP.NET MVC5 新特性:Attribute路由使用详解
1.什么是Attribute路由?怎么样启用Attribute路由? 微软在 ASP.NET MVC5 中引入了一种新型路由:Attribute路由,顾名思义,Attribute路由是通过Attrib ...
- ASP.NET MVC5 :Attribute路由使用详解
1.什么是Attribute路由?怎么样启用Attribute路由? 微软在 ASP.NET MVC5 中引入了一种新型路由:Attribute路由,顾名思义,Attribute路由是通过Attrib ...
- [摘录] 当页[ModalRoute.of(context)]路由属性详解
ModalRoute.of(context) API可以获取当前路由对象,通过它我们可以获取关于当前页面的所有属性: 属性: isActive 当前路由是都位于navigator中:如果该路由acti ...
- ASP.NET MVC路由配置详解
命名参数规范+匿名对象 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", ...
随机推荐
- fastjson自由:controller上指定active profile,让你想序列化什么字段就序列化什么字段
一.前言 最近有个需求,其实这个需求以前就有,比如定义了一个vo,包含了10个字段, 在接口A里,要返回全部字段: 但是在接口B里呢,需要复用这个 vo, 但是只需要返回其中8个字段. 可能呢,有些同 ...
- [Neo4j]Conda虚拟环境中安装python-igraph
neo4j算法需要用到python-igraph包,但试过很多方法,都失败了 pip install python-igraph 安装失败, 提示C core of igraph 没有安装. 在con ...
- [BZOJ] DZY Loves Math 系列 I && II
为了让自己看起来有点事干 ,做个套题吧..不然老是东翻翻西翻翻也不知道在干嘛... \(\bf 3309: DZY \ Loves \ Math\) 令 \(h=f*\mu\) 很明显题目要求的就是\ ...
- CSPS模拟 59
经ooo提醒咕题解会掉rp 我反正也冒着改不完题的风险,就开始颓博了 话说好久没这么舒坦的垫过底了233 上来一看T1,立刻就转化题意为有奇偶性和距离限制的bfs 然后就没考虑子串不能越过母串边界的事 ...
- Elasticsearch 技术分析(八):剖析 Elasticsearch 的索引原理
前言 创建索引的时候,我们通过Mapping 映射定义好索引的基本结构信息,接下来我们肯定需要往 ES 里面新增业务文档数据了,例如用户,日志等业务数据.新增的业务数据,我们根据 Mapping 来生 ...
- DAY 5 搜索
搜索 开篇: mayan游戏(noip2011 day1 T3) 这道题就是个码量题,老师讲题时淡淡的说写完前两题就花一个半小时了,最后一题不快点打会调不出来,对于一个三个半小时就写两题的蒟蒻来说这. ...
- StringBuffer 和 StringBuilde
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- RocketMQ 主从同步若干问题答疑
目录 1.初识主从同步 2.提出问题 3.原理探究 3.1 RocketMQ主从读写分离机制 3.2 消息消费进度同步机制 4.总结 温馨提示:建议参考代码RocketMQ4.4版本,4.5版本引入了 ...
- html5 点击播放video的方法
html5 点击播放video的方法<pre> <video videosrc="{$vo.shipinurl}" controls="" x ...
- Linux如何添加硬盘
一.命令操作: df #查看磁盘空间 fdisk #分区/查看分区 mkfs #格式化 df -h(以人类易读) -m(以M为单位读取) #查看硬 ...