ThinkPHP5静态地址路由和动态路由的区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThinkPHP5静态地址路由和动态路由的区别?相关的知识,希望对你有一定的参考价值。
有什么区别?
静态路由:指的是路由是固定的,是在配置文件里面固定好的。动态路由:路由带有参数或者使用正则表达式进行匹配。
两者都是在配置文件中进行设置,最大的区别就是静态路由是固定的,一条路由规则匹配一条url,而动态路由就是一条路由匹配多多条url,简单来说。静态路由是一对一,动态路由是一对多。 参考技术A ThinkPHP URL 路由简介
简单的说,URL 路由就是允许你在一定规则下定制你需要的 URL 样子,以达到美化 URL ,提高用户体验,也有益于搜索引擎收录的目的。
例子
原本的 URL 为:
http://www.5idev.com/index.php/Products/Show/category/5/id/123
该 URL 的本意是显示第 5 分类中 id 为 123 的产品。经过 URL 路由改写后 URL 可以为:
http://www.5idev.com/index.php/product/5/123
如果使用 .htaccess 文件的 Rewrite 规则再把入口文件隐藏,则上面的 URL 可以进一步简化为:
http://www.5idev.com/product/5/123
这个 URL 地址就相对比较简单易容。
提示:使用 Apache 的 URL Rewrite 规则也能达到 URL 定制的功能,在此就不展开了,感兴趣的请参看 Apache Rewrite 相关的文章。
ThinkPHP URL 路由配置
在 ThinkPHP 中要使用 URL 路由功能,需要做如下配置:
在项目配置文件 Conf/config.php 里面开启路由功能(设置为 true):
'URL_ROUTER_ON' => true,
路由规则定义
与 2.x 版本不同,3.0 路由规则定义于项目配置文件 config.php 内,格式为数组格式,具体定义规则又分为规则路由和正则路由。规则路由语法如下:
格式1:'路由规则'=>'[分组/模块/操作]?额外参数1=值1&额外参数2=值2...'
格式2:'路由规则'=>array('[分组/模块/操作]','额外参数1=值1&额外参数2=值2...')
格式3:'路由规则'=>'外部地址'
格式4:'路由规则'=>array('外部地址','重定向代码')
语法说明
路由规则即是我们要在 URL 中显示出来规则,后面元素值部分是实际的 URL 地址及参数
路由规则中如果以 : 开头,表示动态变量,否则为静态地址
格式2的额外参数可以传入数组或者字符串
路由规则支持变量的数字约束定义,例如:'product/:id\d'=>'Products/Show'
路由规则非数字变量支持排除,例如 'news/:cate^add|edit|delete'=>'News/category'
路由规则支持完整匹配定义,例如:'product/:id\d$'=>'Products/Show'
路由规则中的静态地址部分不区分大小写
外部地址中如果要引用动态变量, 采用 :1、:2 的方式
规则路由可以支持 全动态和动静结合定义,例如 ':user/blog/:id'=>'Home/Blog/user'
这些规则及语法说明比较晦涩难懂,下面会有实例来对照以便理解上述路由规则及语法说明。
如果在配置文件里定义了路由开启功能,系统在执行 Dispatch 解析的时候,会判断当前 URL 是否存在定义的路由名称,如果有就会按照定义的路由规则来进行 URL 解析。追问
区别呢?
thinkphp 规则路由
规则路由是一种比较容易理解的路由定义方式,采用ThinkPHP设计的规则表达式来定义。
规则表达式
规则表达式通常包含静态地址和动态地址,或者两种地址的结合,例如下面都属于有效的规则表达式:
‘my‘ => ‘Member/myinfo‘, // 静态地址路由
‘blog/:id‘ => ‘Blog/read‘, // 静态地址和动态地址结合
‘new/:year/:month/:day‘=>‘News/read‘, // 静态地址和动态地址结合
‘:user/:blog_id‘ =>‘Blog/read‘,// 全动态地址
规则表达式的定义始终以“/”为参数分割符,不受
URL_PATHINFO_DEPR
设置的影响
每个参数中以“:”开头的参数都表示动态参数,并且会自动对应一个GET参数,例如:id
表示该处匹配到的参数可以使用$_GET[‘id‘]
方式获取,:year
、 :month
、:day
则分别对应$_GET[‘year‘]
、 $_GET[‘month‘]
和 $_GET[‘day‘]
。
数字约束
支持对变量的类型检测,但仅仅支持数字类型的约束定义,例如
‘blog/:idd‘=>‘Blog/read‘,
表示只会匹配数字参数,如果你需要更加多的变量类型检测,请使用正则表达式定义来解决。
目前不支持长度约束,需要的话采用正则定义解决
函数支持
可以支持对路由变量的函数过滤,例如:
‘blog/:idd|md5‘=>‘Blog/read‘,
表示对匹配到的id变量进行md5处理,也就是说,实际传入read操作方法的$_GET[‘id‘]
其实是 md5($_GET[‘id‘])
。
注意:不支持对变量使用多次函数处理和函数额外参数传入。
可选定义
支持对路由参数的可选定义,例如:
‘blog/:yeard/[:monthd]‘=>‘Blog/archive‘,
[:monthd]
变量用[ ]包含起来后就表示该变量是路由匹配的可选变量。
以上定义路由规则后,下面的URL访问地址都可以被正确的路由匹配:
http://serverName/index.php/Home/blog/2013
http://serverName/index.php/Home/blog/2013/12
采用可选变量定义后,之前需要定义两个或者多个路由规则才能处理的情况可以合并为一个路由规则。
可选参数只能放到路由规则的最后,如果在中间使用了可选参数的话,后面的变量都会变成可选参数。
规则排除
非数字变量支持简单的排除功能,主要是起到避免解析混淆的作用,例如:
‘news/:cate^add|edit|delete‘=>‘News/category‘
3.2.2版本开始,为了避免和函数规则冲突,规则路由排除分隔符改为“-”,所以上面的路由定义需要改为: ‘news/:cate^add-edit-delete‘=>‘News/category‘
因为规则定义的局限性,恰巧我们的路由规则里面的news和实际的news模块是相同的命名,而:cate
并不能自动区分当前URL里面的动态参数是实际的操作名还是路由变量,所以为了避免混淆,我们需要对路由变量cate进行一些排除以帮助我们进行更精确的路由匹配,格式^add|edit|delete
表示,匹配除了add edit 和delete之外的所有字符串,我们建议更好的方式还是改进你的路由规则,避免路由规则和模块同名的情况存在,例如
‘new/:cate‘=>‘News/category‘
就可以更简单的定义路由规则了。
完全匹配
规则匹配检测的时候只是对URL从头开始匹配,只要URL地址包含了定义的路由规则就会匹配成功,如果希望完全匹配,可以使用$符号,例如:
‘new/:cate$‘=> ‘News/category‘
http://serverName/index.php/Home/new/info
会匹配成功,而
http://serverName/index.php/Home/new/info/2
则不会匹配成功。、
如果是采用
‘new/:cate‘=> ‘News/category‘
方式定义的话,则两种方式的URL访问都可以匹配成功。
完全匹配的路由规则中如果使用可选参数的话将会无效。
以上是关于ThinkPHP5静态地址路由和动态路由的区别?的主要内容,如果未能解决你的问题,请参考以下文章