“路由是项目开发中比较重要的一个环节,每个项目都会使用路由进行管理接口,接下来本文会从源码方面带大家一起学习路由。
”
同样代码先从这里开始,但是这次的关注点是在路由参数和变量规则上。
这俩个点只是简单的给大家说明一下使用和简单的执行流程。
比较深的理解就不去说明了, 因为这俩个点在平时开发过程中是不怎么使用的。
在上文中还记得在文件thinkphp/library/think/route/RuleItem.php
中我们看到过关于路由参数的使用吧!
并且文档中也给了很多支持的参数,如下图。
那这个路由参数是怎么使用的呢!
接着使用之前我们使用的路由,并且给设置上URL后缀检测,支持匹配多个后缀。
那么我们设置的这个路由应该怎么访问呢!
如果按照正常的路由规则进行访问是会报错的,正确的访问方式请继续看。
正确的请求地址应该为http://www.source.com/index.php/hello/1.html
,也就是在请求地址上需要拼接我们设置的后缀html。
这块的具体执行流程使用代码追踪器简单的看一下即可,咔咔这里就不做演示了。
对于路由参数咔咔这里在给大家演示一个案例,就基本结束了。
全局路由参数
路由参数这块最后一个说明的就是全局路由参数。
直接来到文档就可以看到。
这里咔咔设置俩个路由规则做测试,一个参数可选,一个必选,并且设置上路由规则添加文件后缀。
传参数时的请求地址。
不传参数的请求地址。
以上就是针对路由参数写的内容。
没有去做特别深的讲解,基本就是说明了怎么使用,有这个东西的存在,所以了解即可。
变量规则
同样的变量规则,这个在咔咔的日常开发工作中是更不可用的。
变量规则咔咔认为唯一的好处就是对参数进行过滤。
也就是说变量规则是在路由规则存在参数时才会存在的行为。
咔咔这里给大家提供一个简单的案例即可。
演示的案例
在路由后边追加参数pattern
那么接下来看一下这个请求如何写。
当参数为数字时可以输出传入的参数。
但是当传入字母的时候就会报错。
所以说变量规则就是对路由规则后的参数进行的过滤,也就是使用正则进行处理的。
截止到这里关于路由参数和变量规则就简单的说到这里了。
虽然说内容很简单,大多数都是使用案例给大家介绍怎么使用,没有去对源码进行深究。
第一平时开发不怎么会去使用。
第二在后文中还需要进一步深入了解,这里只是做一个认识。
其实说到这里估计还是有很多人不明白,为什么输入路由地址就可以出现对内的内容,这个后期会进行深入的了解。
资源路由的设置也是很简单。
同时使用命令行来创建文件也更是方便。
创建的控制器本身就是一个资源路由文件。
接着还是会执行到Route文件的resource方法。
这个方法同样会有路由规则、路由地址、路由参数、变量规则。
接着就会来到thinkphp/library/think/route/Resource.php
类
在这个类中及时做一些简单的属性赋值。
再就是咔咔圈出来的地方,接下来咔咔会对圈出来的地方进行说明。
由于resource类继承这RuleGroup类,所以会跳转到thinkphp/library/think/route/RuleGroup.php类里。
来到这个方法执行的动作。
blog/<name> 或者 blog/<name? >
object(think\route\Domain)
,需要需要路由文章的第一篇第三节,并且在这一步就会对fullName进行赋值。然后在就返回上层看接下来的东西。
设置分组的路由规则处理完之后就是对一些属性进行赋值,主要为一下三个。
属性赋值就没有什么说的了,就是需要明白对应的属性做的事情即可。
在紧接着就是会以请求方式为键值 以$this为值 返回本类实例,并且会进行检测此路由方法是否为注解路由。
返回的结果咔咔打印出来给大家简单的看一下,内容没有截取全,知道这个值是什么就行了。
以上执行完之后就会返回上层去执行lazy方法
首先知道这个传入的这个参数是什么:路由是否延迟解析
接着就会来到lazy方法
在这个方法中会去调用parseGroupRule,并且传入的参数就是分组的路由规则
这块的内容就是关于路由分组的,这里就不走探讨了。
直到这里关于资源路由就简单说到这里
最后咔咔将执行脑图给大家画出来
其实在上节中存在一行这样的代码$this->parent->getDomain()
这行代码根据方法名字都知道是获取请求域名的
但是都知道这个域名是在哪里进行设置的吗?
当你请求这个资源路由时,就会执行到Route类的构造函数
在构造函数里边有这样一行代码,就是来获取请求域名的
就会来到host方法
在host方法中,这个参数为true
这里只需要关注$this->server('HTTP_HOST')
即可,就是用来获取域名地址的
在咔咔圈出来的第二处可以看到,第一个条件是成立的,但是第二个条件是不成立的
所以会直接返回上一步获取出来的$this->host
打印$this->host
,这里为什么会执行俩次就不对此解释了,有疑问的可以使用函数debug_backtrace
来进行查看。
紧接着就会执行初始化默认域名这个方法
也就是在这里对域名进行了初始化
此时还会有疑问就是明明是在thinkphp/library/think/route/Resource.php
这个类里边执行的啊!
设置域名地址是在thinkphp/library/think/Route.php
这个类里边的啊!
关于这个一想就能明白是因为继承关系的啦!
那么到这里对于这个域名的设置应该就很清楚了,如果还不明白就多看看咔咔写的文章哈!
咔咔写一篇文章估计需要几个小时,但是你们看也就几分钟,几分钟能看个啥啊!
对着代码慢慢,要的是质量,不是效率哈!
那么截止到这里关于域名是在什么时候设置的就讲解完了,接下来会对路由配置-数组方式配置解读
其实这里估计很多人看了后都会有点懵。
大多数都是不理解,这是什么意思,这玩意在哪!
其实这个配置是在5.1之后才有的,咔咔翻过之前的版本是不存在这个配置的。
这个配置的位置其实就是咱们一直学习的Route路由里边,没想到吧!就是这么强大。
就是路由配置里边的那个return。
在回顾一下路由文件的加载吧!
首先是入口文件,这个是毫无疑问的。
咔咔圈起来的地方会返回App的这个实例,如果有不明白的可以去看容器那一篇文章。
所以这行代码会执行到App类的run方法。
那么来到thinkphp/library/think/App.php
这个类的run方法看一下。
能直接看到的就是初始化应用。
来到初始化应用就可以看到关于路由初始化
来到routeInit方法
在导入路由配置时是对其有过一次判断,这里的判断就是针对的路由配置文件中的数组方式配置。
到这里关于路由配置什么时候加载的应该就有一定的了解了。
但是关于数组方式配置路由在文档中是没有提到的,也就是说并没有使用案例。
所以我们就需要在根据import
这个方法进行追踪。
直接找到使用方法即可。
这里关于$this->route->import($rules);
这行代码,咔咔在做一次解释。
其实也就是$this->route
为什么可以执行到Route类。
首先我们需要先知道的就是App类是继承这Container类的
然后在Container类的最后存在几个魔术方法。
当App中调用不存在的Route类时就会执行这个__get这个魔术方法。
然后就会执行__get魔术方法中的make方法。
关于这个方法,咔咔说过了不下三次了,可以去看容器那一篇文章哈!
接着继续我们的行军之路,来到thinkphp/library/think/Route.php
的导入配置文件的路由规则,方法import
在这个方法中可以看到几个熟悉的变量规则
那么使用这几个值进行简答的测试一下
刚好在第二节中对资源路由进行了说明,那么接下来就使用检查资源路由为条件进行测试
一定要把之前设置的资源路由配置给关闭,否则是无法进行测试的
这个时候进行一次访问
没错,就是这样,使用起来就是如此的简单
其实数组方法配置路由就跟资源路由是一样的,只不过是执行的顺序而已
最终也是通过循环将路由规则传递给resource方法
同样也是执行的这个方法
本节就简单的聊到这里,主要就是对路由初始化需要有一定的理解
并且学会使用路由数组方式的配置
这种方式不论是在之前的版本还是5.1还是发布的6.0版本都是不经常使用的,也可以说是根本不会用到的
这里提到只是为了给大家在温习一下路由初始化的过程,和知道数组配置路由到底是干什么的
哪里有疑问就要解决哪里,而不是放着不去解决
以上是ThinkPHP路由参数以及资源路由解析的详细内容。更多信息请关注PHP中文网其他相关文章!