thinkphp6.0-------路由

一、路由的开始

在Http类runWithRequest方法中调用了dispatchToRoute方法,dispatchToRoute方法中包括了路由配置文件的加载和Route类中的dispatch方法的调用,开启了路由模块之旅。

二、路由流程

1.Route类

成员变量:

domains:用来保存域名规则类(RuleGroup类)数组(默认有个键值:“-”)

config:配置信息

rest:REST定义

request:请求对象

ruleName:路由标识类(RuleName类)

一些有关路由方面的变量

成员方法:

构造函数:设置一些变量(用到RuleName类,Domain类)

import:批量导入路由标识(设置变量ruleName中的item属性)

config:获取配置信息

init:初始化一些配置信息

dispatch:路由调度-----------(第一步:路由的起始点)

(1)设置一些属性值,包括调用了init方法;

(2)根据是否启用路由配置(app.with_route)有则读取路由配置文件(在Http类进行的读取)进行检查路由(check方法),没有则直接调用url方法进行解析,最终得到Dispatch类的子类Url类;

(3)执行此Url类的init方法

(4)再在中间件流程中运行一遍

(5)执行Url类的run方法,返回Response类

check:检查路由(包括域名的检查,跨域名的检查和路径的检查),最终调用url方法,返回Dispatch类的子类Url类(url方法的返回值一致

path:获取请求的pathinfo信息,用于路由检查和路由的解析(调用request类中的pathinfo方法)

url:返回new的Dispatch类的子类Url类(进入Url类流程)--------------(第二步)

调用Rule类的parseUrlPath方法将路由解析为控制器和方法名

checkDomain:检查域名规则是否存在,存在则返回对应的规则类(RuleGroup类),也就是在变量domains中进行检查

buildUrl:生成url(进入think\route\Url类流程)

2.父类Dispatch类------->Controller类--------->Url类(继承关系):最终对路由解析到调用控制器类和其方法生成响应数据

Url类:

构造函数(请求类,路由规则类,url地址):初始化变量,解析url(调用方法parseUrl),调用父级的构造函数-----(第三步)

parseUrl:通过路由规则,将url解析为控制器、执行方法和请求参数(设置param变量),并返回控制器、执行方法组成的数组(传给父级设置dispatch变量);

hasDefinedRoute:检测路由是否定义过

Controller类:

init:调用父类init方法,将变量dispatch的值赋值给控制器名和方法名两个变量,并同时设置request类的这两个属性-------(第五步)

exec:最终的控制器执行操作--------(第八步)

(1)根据控制器变量实例化控制器类(调用controller方法)

(2)注册中间件(调用registerControllerMiddleware方法)

(3)走一遍中间件流程

(4)执行控制器类中的方法,并返回相应的结果;

controller:实例化控制器类

Dispatch类:

成员变量:

app、request、rule(路由规则)、dispatch(控制器和执行方法的数组)、param(传给执行方法的参数)

成员方法:

构造函数:初始化设置成员变量---------(第四步)

init:设置app变量,执行doRouteAfter方法;-------(第六步)

run:执行路由调度 --------(第七步)

(1)调用exec方法进行执行控制器的方法,返回响应数据;

(2)将此数据作为参数传给autoResponse方法生成Response类并返回;

autoResponse:对参数进行判断,并生成对应的Response类并返回;-----(第九步:最终返回结果:Response类)

三、路由规则相关类

路由的配置文件(Route::get('hello/:name', 'index/hello');),相当于为Route类中的group变量(Domain类)rules属性增加元素(ruleItem类),同时group变量对应的值也保存在domains数组中。从Route类的方法dispatch调用check方法开始,进行调用checkDomain方法,并返回Domain类,再调用Domain类的check方法进入路由检测流程。

1.Rule类

parseRule:解析匹配到的规则路由,并调用dispatch方法进行调度------------------(第五步)

dispatch:路由调度,返回Dispatch类或其子类----------------------(第六步)

根据判断路由参数的类型等来进行不同的方法的调用,包括(dispatchMethod、dispatchController方法,还有Dispatch类的子类Callback类,)

dispatchMethod和dispatchController:将路由解析为控制器和方法名(调用parseUrlPath方法),并传给Dispatch类的子类Controller并返回,保证Route类的check方法返回Dispatch类型(或子类)----------------------(第七步,到此流程进入到Dispatch类族中了,后面的流程就从(二、路由流程)中的第三步开始

parseUrlPath:将路由解析为控制器和方法

2.RuleName类:路由标识---------相当于路由规则类池

成员变量:

item:路由标识,二维数组保存键值对应多个路由规则(RuleItem类)

rule:路由规则,二维数组,键值对应多个路由规则(以路由规则类中的路由地址变量值作为键值对应此路由规则)

group:路由分组,数组,键值应用一个RuleGroup类

成员方法:

setName:给路由标识参数添加一个路由规则,添加item变量数据

setGroup:设置路由分组标识,添加group变量元素

setRule:设置路由规则,

import:导入路由标识,设置item变量

getRuleList:获取全部的路由列表,对rule变量进行循环,获取其中的所有路由规则中的一些属性值

getName:根据路由标识获取路由信息,通过参数在变量item中查找相应的路由规则(条件包括路由标识、对应路由规则类中的两个属性)

另外2个get方法,获取对应的数据

3.ruleItem类:路由规则类-----继承了虚拟类Rule类

check:调用checkRule方法检测路由----------(第三步)

checkRule:-----------(第四步)

(1)进行参数的有效性检测

(2)调用方法urlSuffixCheck,

(3)调用方法match,

(4)调用方法parseRule(父类)

urlSuffixCheck:去掉路由上的“/”和后缀

match:检测URL和规则路由是否匹配,并解析出参数返回

4.RuleGroup类:继承Rule类

check:检测分组路由---------(第二步)

(1)先进行路由的有效性检测

(2)根据请求类型,在变量数组rules中查找对应的所有的路由规则(ruleItem类)

(3)循环这些路由规则(ruleItem类),并执行其check方法对路由进行检测

5.Domain类:继承RuleGroup类

check:检测分组路由,返回值是Dispatch类或其子类--------(第一步:入口)

(1)调用方法checkUrlBind检查是否进行了绑定,有绑定则返回;

(2)没有绑定时再调用父类(RuleGroup类)的check方法,同时返回;

checkUrlBind:检测URL绑定:没有绑定直接false,有绑定则通过解析判断分别调用bindToClass、bindToNamespace、bindToController方法,返回Dispatch类或其子类;

没有把 a.适用什么路由规则 和 b.如何对规则进行的解析这些详细功能表现出来,后面有时间再加。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值