当我们访问项目的/test路径时,浏览器会向我们的服务器端发送一个请求。我们打开浏览器的开发者工具,打开network选项卡。

在地址栏中敲击回车,浏览器向我们的服务器端发送了一个请求。请求的地址是127.0.0.1:8000/test路径,请求的方法是GET方法,请求的头部headers中,浏览器自动添加了一些参数。

当Symfony接收到这个请求时,会将请求和请求参数封装成一个Request对象。再交由路由系统,根据请求的路径来调用对应的controller的action方法。

对于/test路径会调用index方法,在index方法中我们可以通过一些方法来获取请求的参数,然后根据参数来进行对应的处理。

比如说存取数据库、一些计算等等,最后我们需要返回一个Response对象。

查看Response类的源码,按着command键,鼠标点击Response。Response对象包含了请求返回的内容,返回的状态码,还有返回的headers,这样就完成了一个HTTP请求的处理。

我们来跟踪一遍代码的执行过程,来加深理解。

我们已经安装了PHP的xdebug扩展,我们修改一下xdebug的配置。打开控制台查看一下PHP配置文件的路径,我们修改一下PHP配置文件。

在xdebug配置段下,我们修改xdebug的模式为debug模式,我们修改idekey为PHPSTORM,这样我们在我们的编辑器中就可以直接使用xdebug了,其他三项我们按照这个配置直接写就行了。

[xdebug]
zend_extension="xdebug.so"
xdebug.mode = debug
xdebug.idekey = PHPSTORM
xdebug.cli_color = 0
xdebug.start_with_request = yes
xdebug.log_level = 0

修改完成之后记得保存,重启我们的项目,在控制台中按control + c停止服务器,再重启服务器。

Symfony项目的入口文件是public目录中的index.php文件,我们在index.php文件中下断点,点击这个按钮监听debug请求。

刷新/test路径,断点已经停到这了,我们一步一步跟着走。我们现在学习的Symfony5.3版本,它的index.php文件和5.2之前的版本不一样,我们按照最新的版本来学习。

回到浏览器,我们搜索symfony 5.3 index.php,我们看下5.3版本的更改,打开这个页面。

Symfony 5.3增加了一个Runtime组件,它是为了让Symfony在不修改代码的情况下可以兼容更多的运行时,比如说FPM、React-PHP或者Swoole等运行时,所以说他和之前版本的index.php有了大的更改。

回到项目我们断在了第5行,在这一行很重要,我们进入第5行的代码,它进入autoload_runtime.php这个文件。

我们下一步,再下一步,在这里SCRIPT_FILENAME,这个变量是我们的index.php。它会再次调用我们的index.php。

我们下一步,在再次调用index.php时,它会返回第7行代码,返回一个闭包函数。下一步,这时我们看$app变量,它是一个闭包函数。

我们继续,在第21行,我们并没有配置APP_RUNTIME这个变量,所以在这一行$runtime变量它是SymfonyRuntime的全类名。

下一步,这一行$runtime会进行实例化。

继续,在这一步他会解析和处理我们的闭包方法。

继续,在第30行会执行我们的闭包方法。

再下一步,这时$app变量就会生成我们的Kernel实例,最重要一步就在这里。

运行时($runtime)实例会根据我们的$app的类型获取对应的Runner对象,然后再调取Runner对象的run方法来处理请求,点击步入来进入代码。

在上一步我们$app参数它是一个Kernel对象,Kernel对象是HttpKernelInterface的实例,所以这一步他会返回HttpKernelRunner对象。

下一步,然后,它会调用Runner对象的run方法。

下一步,在run方法中最重要的一步就是使用Kernel对象来处理请求。

在继续下一步之前,我们打开浏览器搜索使用symfony kernel,我们看一下HttpKernel文档,文档给我们提供了整个Kernel处理请求的流程。

首先Symfony会将我们的请求参数封装成一个Request对象,然后根据Request对象中的参数解析到对应的controller方法。再将controller action方法中的各个参数进行处理,然后调用controller的action方法,如果action方法返回的是Response对象,那就直接可以结束。如果controller方法返回的是view对象,我们最终要转化为Response对象,然后结束这段请求。

回到项目,我们继续跟踪代码,在第37行,我们进入handle方法,点击步入,在handle方法中我们继续往下看,在第199行他会调用HttpKernel对象的handle方法。

我们直接下一步到199行,首先它会获取HttpKernel对象,进入,通过容器来获取HttpKernel对象。

这里我们后面会讲,然后再下一步。

现在就到了HttpKernel的handle方法中,在第79行,重要的一步就是handleRaw,它会处理请求和类型。 我们下一步,再进入handleRaw方法。

我们一步一步跟踪,首先它会将我们的请求进行压栈。下一步,这是一个事件,我们后面课程会讲到Symfony的事件处理。

再下一步下一步,一直到140行,Symfony会根据我们的请求,获取对应的controller方法。

继续下一步,到149行,Symfony会根据我们的请求和controller方法来解析controller方法的参数。

我们继续下一步,在157行,会执行controller的action方法。

继续,在160行,如果$response它不是Response对象的话,它要进行事件处理,最终要返回一个Response对象。

我们回看handleRaw方法,handleRaw方法它的返回值一定是个Response对象,当handleRaw方法最后执行完毕后,我们的请求就处理结束了。

我点击下一步,在Kernel类的201行,进行请求的出栈操作。继续,在Runner对象中,对Response对象进行发送。在第41行,Kernel对象结束这个请求。

到这一步,整个Symfony处理一个请求的流程就结束了。

如果你是Symfony的初学者,看完本节课之后你会一脸懵。没关系,随着我们的深入学习,我们可能会再次的跟踪整个处理请求的流程。你也可以自己追踪这段流程来加深理解。

HttpKernel组件是Symfony的核心。其他的开源项目大多也使用了这套组件,在课程的后期,如果你有兴趣,你可以使用HttpKernel组件来开发出自己的框架,本节课先到这里。

在下一节,我们将讲解如何在action方法中来获取到请求的一些参数。

本文转载于:https://www.teebb.com/content/http-workflow

《Symfony 5全面开发》教程04、Symfony处理http请求的流程的更多相关文章

  1. Android快乐贪吃蛇游戏实战项目开发教程-04虚拟方向键(三)三角形按钮效果

    该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.知识点讲解 当我们点击系统自带的按钮时,按钮的外观会发生变化.上篇博文中我们 ...

  2. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  3. 《Symfony 5全面开发》教程02、安装运行环境并初始化Symfony项目

    Symfony是PHP框架,在学习Symfony之前,我们需要安装PHP运行环境.如果你是MacOS系统,可以使用Homebrew来安装PHP运行环境. Homebrew官网 https://brew ...

  4. 《Symfony 5全面开发》教程01、Symfony介绍

    大家好,我是伟伟权,你正在观看的是<Symfony5全面开发>视频教程. Symfony是一款优秀的PHP框架,我们到Symfony官网来查看一下Symfony的介绍.Symfony是一组 ...

  5. 【GStreamer开发】GStreamer播放教程04——既看式流

    目的 在<GStreamer基础教程--流>里面我们展示了如何在较差的网络条件下使用缓冲这个机制来提升用户体验.本教程在<GStreamer基础教程--流>的基础上在扩展了一下 ...

  6. 嵌入式Linux开发教程:Linux常见命令(上篇)

    摘要:这是对周立功编著的<嵌入式Linux开发教程>的第7期连载.本期刊载内容有关LinuxLinux常见命令中的导航命令.目录命令和文件命令.下一期将连载网络操作命令.安装卸载文件系统等 ...

  7. ArcGIS Runtime for Android开发教程V2.0(2)开发环境配置

    原文地址: ArcGIS Runtime for Android开发教程V2.0(2)开发环境配置 - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.c ...

  8. Unity多玩家网络游戏开发教程1章Unity带有网络功能

    Unity网络多玩家游戏开发教程第1章Unity自带网络功能 Unity拥有大量的第三方插件.专门提供了对网络功能的支持. 可是.大部分开发人员第一次接触到的还是Unity自带的网络功能.也就是大家常 ...

  9. Easyui + asp.net mvc + sqlite 开发教程(录屏)适合入门

    Easyui + asp.net mvc + sqlite 开发教程(录屏)适合入门 第一节: 前言(技术简介) EasyUI 是一套 js的前端框架 利用它可以快速的开发出好看的 前端系统 web ...

随机推荐

  1. AI换脸实战教学(FaceSwap的使用)---------第一步Extration:提取人脸。

    市面上有多款AI换脸的方法,笔者这里节选了Github那年很火的开源项目FaceSwap: (很早就实践了,但是忘记记录啦hhh,请勿用于不正当用途哦) 做了一篇详细教学,包括配置,参数设置,换脸效果 ...

  2. 学习JAVAWEB第八天

    1. C/S:客户端/服务器端 2. B/S:浏览器/服务器端 2. 资源分类 1. 静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源.静态资源可以直接被浏览器解析 * 如: html,c ...

  3. 正向代理 、反向代理, 和 Linux系统配置nginx。

    一.正向代理和反向代理的简单介绍. 2.代理 中间商,赚差价 在没有代理的时候: 茅台酒厂--->生产了一批酒--->通过物流发送到客户的家中/客户直接到酒厂购买酒--->突然有一个 ...

  4. 初识 oracle!

    /** * 一.oracle的简介? * 1.是一个关系型数据库,强大! * * 软件名 开发商 用途 * * oracle oracle 专门的软件公司 收费!1.连接的用户数,2.服务器的cpu的 ...

  5. Jquery Validate 使用记坑

    在使用jquery validate 的时候 使用的有remote 需要在页面初始化的时候调用, 这样在文本框输入完的时候就会调用远程方法验证,否则,在最后表单验证的时候会忽悠remote的返回值验证 ...

  6. 守护石谈学习Java之路

    ​这次在CSDN Blink发表了几篇关于Java编程学习的小作文,讲述了Java工程师的成长路线.Java学习的技能树和入门工作要关注的核心问题,我继续做一次文章的整合与延展,以文章的形式发表出来, ...

  7. 为 ubuntu 切换更新源

    感谢大佬:https://blog.csdn.net/sudaning/article/details/83445677 目录 备份 修改源文件 更新列表 更新软件 备份 sudo cp /etc/a ...

  8. MySQL数据类型的最优选择

    MySQL数据类型的最优选择   慎重选择数据类型很重要.为啥哩?可以提高性能.原理如下:            ● 存储(内存.磁盘).从而节省I/O(检索相同数据情况下)      ● 计算.进而 ...

  9. jqGrid 修改单元格值或者替换图片及其他

     var rowIds = jQuery("#list1").jqGrid('getDataIDs');                for (var k = 0; k < ...

  10. 痞子衡嵌入式:揭秘i.MXRT1060,1010上串行NOR Flash冗余程序启动设计

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1060,1010上串行NOR Flash冗余程序启动设计. 工业产品设计里经常会有冗余程序/备份程序设计的需求,因为在工业 ...