Rumah >rangka kerja php >ThinkPHP >ThinkPHP路由参数以及资源路由解析

ThinkPHP路由参数以及资源路由解析

咔咔
咔咔asal
2020-12-01 12:01:464246semak imbas

路由是项目开发中比较重要的一个环节,每个项目都会使用路由进行管理接口,接下来本文会从源码方面带大家一起学习路由。

一、路由参数和变量规则

同样代码先从这里开始,但是这次的关注点是在路由参数和变量规则上。

这俩个点只是简单的给大家说明一下使用和简单的执行流程。

比较深的理解就不去说明了, 因为这俩个点在平时开发过程中是不怎么使用的。

image.png
注册路由规则

在上文中还记得在文件thinkphp/library/think/route/RuleItem.php中我们看到过关于路由参数的使用吧!

image.png
关于路由参数处理的地方

并且文档中也给了很多支持的参数,如下图。

image.png
文档支持的参数

那这个路由参数是怎么使用的呢!

接着使用之前我们使用的路由,并且给设置上URL后缀检测,支持匹配多个后缀。

image.png
路由案例

那么我们设置的这个路由应该怎么访问呢!

如果按照正常的路由规则进行访问是会报错的,正确的访问方式请继续看。

image.png
访问结果

正确的请求地址应该为http://www.source.com/index.php/hello/1.html,也就是在请求地址上需要拼接我们设置的后缀html。

image.png
访问结果

这块的具体执行流程使用代码追踪器简单的看一下即可,咔咔这里就不做演示了。

对于路由参数咔咔这里在给大家演示一个案例,就基本结束了。

全局路由参数

路由参数这块最后一个说明的就是全局路由参数。

直接来到文档就可以看到。

image.png
全局路由参数

这里咔咔设置俩个路由规则做测试,一个参数可选,一个必选,并且设置上路由规则添加文件后缀。

image.png
路由文件

传参数时的请求地址。

image.png
访问结果

不传参数的请求地址。

image.png
访问结果

以上就是针对路由参数写的内容。

没有去做特别深的讲解,基本就是说明了怎么使用,有这个东西的存在,所以了解即可。

变量规则

同样的变量规则,这个在咔咔的日常开发工作中是更不可用的。

变量规则咔咔认为唯一的好处就是对参数进行过滤。

也就是说变量规则是在路由规则存在参数时才会存在的行为。

咔咔这里给大家提供一个简单的案例即可。

演示的案例

image.png
路由文件演示的案例

在路由后边追加参数pattern

那么接下来看一下这个请求如何写。

当参数为数字时可以输出传入的参数。

image.png
第一次请求地址

但是当传入字母的时候就会报错。

image.png
打印结果

所以说变量规则就是对路由规则后的参数进行的过滤,也就是使用正则进行处理的。

截止到这里关于路由参数和变量规则就简单的说到这里了。

虽然说内容很简单,大多数都是使用案例给大家介绍怎么使用,没有去对源码进行深究。

第一平时开发不怎么会去使用。

第二在后文中还需要进一步深入了解,这里只是做一个认识。

其实说到这里估计还是有很多人不明白,为什么输入路由地址就可以出现对内的内容,这个后期会进行深入的了解。

二、资源路由

资源路由的设置也是很简单。

image.png
路由文件

同时使用命令行来创建文件也更是方便。

image.png
使用命令进行创建文件

创建的控制器本身就是一个资源路由文件。

image.png
资源路由控制器

接着还是会执行到Route文件的resource方法。

这个方法同样会有路由规则、路由地址、路由参数、变量规则。

image.png
注册资源路由

接着就会来到thinkphp/library/think/route/Resource.php

在这个类中及时做一些简单的属性赋值。

再就是咔咔圈出来的地方,接下来咔咔会对圈出来的地方进行说明。

image.png
thinkphp/library/think/route/Resource.php

由于resource类继承这RuleGroup类,所以会跳转到thinkphp/library/think/route/RuleGroup.php类里。

来到这个方法执行的动作。

  • 会对路由规则进行简单的处理,如果路由存在参数则需要把路由规则转换为blog/<name> 或者 blog/<name? >
  • 接着就是对$this->parent解释,这里为什么是object(think\route\Domain),需要需要路由文章的第一篇第三节,并且在这一步就会对fullName进行赋值。
  • 最后一步就是进行对fullName进行赋值,其实就是将路由规则赋值给fullName。
image.png
设置分组的路由规则

然后在就返回上层看接下来的东西。

image.png
返回上层文件继续阅读源码

设置分组的路由规则处理完之后就是对一些属性进行赋值,主要为一下三个。

  • 路由变量规则
  • 路由参数
  • REST路由方法定义

属性赋值就没有什么说的了,就是需要明白对应的属性做的事情即可。

在紧接着就是会以请求方式为键值  以$this为值  返回本类实例,并且会进行检测此路由方法是否为注解路由。

返回的结果咔咔打印出来给大家简单的看一下,内容没有截取全,知道这个值是什么就行了。

image.png
返回结果

以上执行完之后就会返回上层去执行lazy方法

首先知道这个传入的这个参数是什么:路由是否延迟解析

image.png
执行完返回上层的代码

接着就会来到lazy方法

image.png
lazy方法

在这个方法中会去调用parseGroupRule,并且传入的参数就是分组的路由规则

这块的内容就是关于路由分组的,这里就不走探讨了。

image.png
分组的路由规则

直到这里关于资源路由就简单说到这里

最后咔咔将执行脑图给大家画出来

image.png
资源理由执行流程

三、关于域名是什么时候设置的

其实在上节中存在一行这样的代码$this->parent->getDomain()

这行代码根据方法名字都知道是获取请求域名的

但是都知道这个域名是在哪里进行设置的吗?

当你请求这个资源路由时,就会执行到Route类的构造函数

image.png
资源路由

在构造函数里边有这样一行代码,就是来获取请求域名的

image.png
构造函数

就会来到host方法

在host方法中,这个参数为true

这里只需要关注$this->server('HTTP_HOST')即可,就是用来获取域名地址的

在咔咔圈出来的第二处可以看到,第一个条件是成立的,但是第二个条件是不成立的

所以会直接返回上一步获取出来的$this->host

image.png
host方法

打印$this->host,这里为什么会执行俩次就不对此解释了,有疑问的可以使用函数debug_backtrace来进行查看。

image.png
打印结果

紧接着就会执行初始化默认域名这个方法

也就是在这里对域名进行了初始化

image.png
初始化默认域名方法

此时还会有疑问就是明明是在thinkphp/library/think/route/Resource.php这个类里边执行的啊!

设置域名地址是在thinkphp/library/think/Route.php这个类里边的啊!

关于这个一想就能明白是因为继承关系的啦!

image.png
thinkphp/library/think/route/Resource.php

那么到这里对于这个域名的设置应该就很清楚了,如果还不明白就多看看咔咔写的文章哈!

咔咔写一篇文章估计需要几个小时,但是你们看也就几分钟,几分钟能看个啥啊!

对着代码慢慢,要的是质量,不是效率哈!

那么截止到这里关于域名是在什么时候设置的就讲解完了,接下来会对路由配置-数组方式配置解读

四、路由配置-数组方式配置解读

其实这里估计很多人看了后都会有点懵。

大多数都是不理解,这是什么意思,这玩意在哪!

其实这个配置是在5.1之后才有的,咔咔翻过之前的版本是不存在这个配置的。

这个配置的位置其实就是咱们一直学习的Route路由里边,没想到吧!就是这么强大。

就是路由配置里边的那个return。

image.png
路由配置文件

在回顾一下路由文件的加载吧!

首先是入口文件,这个是毫无疑问的。

咔咔圈起来的地方会返回App的这个实例,如果有不明白的可以去看容器那一篇文章。

所以这行代码会执行到App类的run方法。

image.png
入口文件

那么来到thinkphp/library/think/App.php这个类的run方法看一下。

能直接看到的就是初始化应用。

image.png
初始化应用

来到初始化应用就可以看到关于路由初始化

image.png
路由初始化

来到routeInit方法

在导入路由配置时是对其有过一次判断,这里的判断就是针对的路由配置文件中的数组方式配置。

image.png
导入路由配置

到这里关于路由配置什么时候加载的应该就有一定的了解了。

但是关于数组方式配置路由在文档中是没有提到的,也就是说并没有使用案例。

所以我们就需要在根据import这个方法进行追踪。

直接找到使用方法即可。

这里关于$this->route->import($rules);这行代码,咔咔在做一次解释。

其实也就是$this->route为什么可以执行到Route类。

首先我们需要先知道的就是App类是继承这Container类的

image.png
继承关系

然后在Container类的最后存在几个魔术方法。

image.png
Container魔术方法

当App中调用不存在的Route类时就会执行这个__get这个魔术方法。

然后就会执行__get魔术方法中的make方法。

关于这个方法,咔咔说过了不下三次了,可以去看容器那一篇文章哈!

image.png
容器类中的make方法

接着继续我们的行军之路,来到thinkphp/library/think/Route.php的导入配置文件的路由规则,方法import

在这个方法中可以看到几个熟悉的变量规则

那么使用这几个值进行简答的测试一下

image.png
检测导入配置文件的路由规则

刚好在第二节中对资源路由进行了说明,那么接下来就使用检查资源路由为条件进行测试

一定要把之前设置的资源路由配置给关闭,否则是无法进行测试的

image.png
路由配置文件

这个时候进行一次访问

没错,就是这样,使用起来就是如此的简单

image.png
访问结果

其实数组方法配置路由就跟资源路由是一样的,只不过是执行的顺序而已

最终也是通过循环将路由规则传递给resource方法

image.png
执行resource

同样也是执行的这个方法

image.png
resource方法

本节就简单的聊到这里,主要就是对路由初始化需要有一定的理解

并且学会使用路由数组方式的配置

这种方式不论是在之前的版本还是5.1还是发布的6.0版本都是不经常使用的,也可以说是根本不会用到的

这里提到只是为了给大家在温习一下路由初始化的过程,和知道数组配置路由到底是干什么的

哪里有疑问就要解决哪里,而不是放着不去解决

Atas ialah kandungan terperinci ThinkPHP路由参数以及资源路由解析. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Thinkphp6自定义状态码Artikel seterusnya:ThinkPHP检测URL路由深度解析