ThinkPHP源码解析之控制器(4)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: ThinkPHP源码解析之控制器

四、路由地址是怎么进行控制器实例化的

在上一节中我们对路由进行了三四期的讲解,最终讲解的位置就路由调度,那么设置的路由是如何执行呢!


接下来使用这个路由作为案例


image.png


还记得在开始进行路由检测时的返回值是什么吗?请看下图



image.png


image.png

当时没有对接下里的代码进行详解,直接说明了实例化控制器,现在要说的就是记录当前调度信息这行代码。


在这里$this->request是使用的当访问不存在的属性时会去执行容器类的魔术方法,最后通过容器返回一个实例。


所以说代码会执行到下图位置,设置或者获取当前请求的调度信息


image.png


通过在控制器实例化这里进行打印会发现在这里的返回的值是index,这个值是在控制器进行设置的,接下来来到控制器进行查看一下。


image.png


来到init方法对result做打印查看结果,使用的是路由地址



image.png

image.png

image.png





你知道到为什么这里的值发生改变了吗?


在上文打印出来的值为下图,为什么在这里就是上图的呢!


image.png


在路由那一节中最后一步就是发起路由调度,最后调用了一个路由到模块/控制器/操作这个方法。


image.png


这个方法dispatchModule最后也是实例化一个类,接下来需要对这个类进行深究


image.png


根据代码追踪可以看到其实就是think\route\dispatch\Module这个类


image.png


来到Module这个类,又会发现继承着Dispatch类


image.png


在thinkphp/library/think/route/Dispatch.php这个类的控制器中,会发现对dispatch这个变量进行了设置。

image.png



这个时候回头在看一下路由到模块/控制器/操作这里的方法传入的参数是什么,哈哈


image.png


所以说最终的值就是刚刚打印的只是单独的数组形式的。


image.png


那么接下来的动作就跟不使用路由访问的流程一样的,就不用在进行解析了。


直到这里关于路由地址是怎么进行控制器实例化的就结束了。


关于给$this->app->controller传入的是index,返回的是整个类名,具体的实现过程就不去解析了,实现的方法是$this->parseModuleAndClass,可以自行进行研究哈!


五、执行autoResponse调度

在第四节中只提到了执行控制器中的方法是从下图的地方进行返回的,但是怎么返回的没有进行详解。


接下里会用一丢丢的时间来说一下是如何执行的。


image.png


访问路由地址为下图,可以看到返回的数据就是控制器中需要返回的数据。


image.png

image.png




打印的值是下图地方,这里就需要明确哈!源码阅读就是这样需要一点点的进行摸索,时间长了就对其中的东西就明白了。


image.png


接下来就对$this->autoResponse($data);这个方法进行深入的解析,这个方法按照字面意思就是自动响应。


image.png


在这个执行流程的第一行中$data instanceof Response,对这个不了解接下来就没办法阅读了。


不会和不明白的还是需要去解决的,阅读源码就这样,一点点的攻克才能获得胜利。


关于instanceof的使用


instanceof可以判断某个对象是否是某个类的实例,判断一个对象是否实现了某个接口。


接下来咔咔针对这个做一个简单的实例给大家演示一下,就明白这个是怎么回事了。


案例一


首先建立俩个类,案例如下图。


image.png


下图就是打印结果,可以看到第一个返回true,第二个返回false。


判断某个对象是否是某个类的实例,也就是说$instance就是类Test的实例,所以会返回true。


image.png


案例二


案例二跟案例一是不同的,建立了一个接口,然后类实现接口的案例。


image.png


最终返回结果全是true,也就是说如果一个类实现了另一个接口,那么在判断时都会是true。


image.png


以上就是针对instanceof给出的俩种演示案例,对其理解就是判断一个实例是否为某个类的实例。


那么就在回到正文,$data instanceof Response这行代码肯定不会成立,因为data传过来的就是控制器返回的值。


所以说代码执行流程会执行到下图位置,使用了is_null函数来做判断,判断肯定为false,所以会执行以下的代码。


在这块代码中前俩个点就不去解析了。


第一个就是默认自动识别响应输出类型,这里就是在判断是否为ajax请求,具体实现方法等咔咔这次把框架源码解析完之后,然后每天会抽一点时间,对框架的一些方法进行一点点的剖析。


第二处位置就是在配置文件获取对应的配置信息,看的是执行的rule类的方法,但是在方法中是执行的获取配置信息的代码。


image.png


接下就需要对上文没提到的第三处进行解析了,也就是代码$response = Response::create($data, $type);


来到类thinkphp/library/think/Response.php的方法create中,这个方法就是用来创建Response对象。


这里只需要去关注一下咔咔圈出来的地方即可,在thinkphp/library/think/response这个目录下是不存在html的。


所以代码会直接去实例化本类,然后进行返回。


image.png


来到本类的构造函数就主要做一下几件事情。


  • 将返回值赋给本类的data属性
  • 设置页面输出类型
  • 返回状态码
  • 设置app实例对象
  • 头部信息


image.png

然后代码会将返回值赋值给autoResponse这个方法的$response这个变量。


最后就是将这个$response给返回出去,并且返回信息如下图打印结果。


image.png

image.png




然后代码依然会向上层返回,回到最初的闭包函数。


在咔咔圈出来的地方,下一行代码也是关于中间件,只需要知道最终返回结果跟上图打印的结果一样即可。


image.png


最终返回结果回到thinkphp/library/think/route/Dispatch.php,咱们也就是从这里开始的解析的。


image.png


将返回的结果返回给$data,然后在进行执行return $this->autoResponse($data);


你没看错,这里的代码熟悉吧!


这个时候返回的结果就是Response的实例,所以会直接返回$response。


image.png


直到这里关于执行控制器中的方法,并且响应就都解析完了。


不轮是设置的路由规则,还是直接使用模块控制器方法的方式访问最终都会通过上文的方式进行返回响应结果。



相关文章
|
27天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
27天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
27天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
3天前
|
自然语言处理 数据处理 索引
mindspeed-llm源码解析(一)preprocess_data
mindspeed-llm是昇腾模型套件代码仓,原来叫"modelLink"。这篇文章带大家阅读一下数据处理脚本preprocess_data.py(基于1.0.0分支),数据处理是模型训练的第一步,经常会用到。
15 0
|
28天前
|
安全 搜索推荐 数据挖掘
陪玩系统源码开发流程解析,成品陪玩系统源码的优点
我们自主开发的多客陪玩系统源码,整合了市面上主流陪玩APP功能,支持二次开发。该系统适用于线上游戏陪玩、语音视频聊天、心理咨询等场景,提供用户注册管理、陪玩者资料库、预约匹配、实时通讯、支付结算、安全隐私保护、客户服务及数据分析等功能,打造综合性社交平台。随着互联网技术发展,陪玩系统正成为游戏爱好者的新宠,改变游戏体验并带来新的商业模式。
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
110 2
|
3月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
93 0
|
3月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
79 0
|
3月前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
79 0
|
3月前
|
安全 Java 程序员
Collection-Stack&Queue源码解析
Collection-Stack&Queue源码解析
107 0

热门文章

最新文章

推荐镜像

更多