首先我们删除上节课所下的断点,在Phpstorm底部我们打开debug选项卡。点击这个按钮展开所有的PHP断点,选中之后点击这个删除,然后我们关闭xdebug监听。

回到浏览器刷新页面,当我们的浏览器访问一个地址时,通常会发送一个GET请求,我们可以在浏览器的访问地址上,使用'?'加上'参数名'='参数值'的方式来添加请求参数。

当我们敲击回车访问时,浏览器会将这个地址和page参数一块发送到我们的服务器端,那么服务器端该如何获取到这个page参数呢?

对于HTTP请求在访问地址后面添加的参数通常叫做query参数

回到项目,我们在action函数中可以添加参数。因为Symfony实现了PSR标准规范的容器接口,可以通过使用依赖注入的方式来解耦合代码。

我们可以在index方法中直接注(口误)入Request对象,这个Request我们要选择HttpFoundation这个命名空间下的类。Symfony为我们提供了dump方法,我们可以用dump方法来查看一下Request对象。我们在这里我们输入die方法,来暂停后面代码的执行。

再次刷新页面,Symfony将我们的请求和请求参数封装成了Request对象。我们来看一下我们的query属性,page参数就在query属性中。 另外还有request属性,files属性,cookies属性,headers等等属性。

request属性通常用于POST请求参数的获取,files通常用于文件的接收。

那么我们该如何获取到page的值呢?Request对象为我们封装了很多方法,获取query,然后get(),传入'page',我们再次查看一下$page。

现在我们已经获取到了page参数(口误)。这里加了两个引号,这是一个字符串类型。如果我们想获取到整数类型该怎么办呢?Request仍然给我们做了封装,我们使用getInt()

再次刷新,这样就变成了一个整数类型。我们按着command键把鼠标移动到getInt方法中,能看到getInt有两个参数。第一个参数是query参数的键,第二个参数是默认值。如果我们的访问地址中没有设置这个键,它将返回一个默认值。

我们在后面输入default值为1,然后回到浏览器,我们去掉page参数,再次访问页面,我们看到默认值为1。

下面我们来发送一个POST请求,我们看Symfony如何处理POST请求中的参数。我们打开postman,我们新建一个请求,请求的方式,我们选择POST方式,地址输入127.0.0.1:8000/test路径。POST请求我们需要在Body中填入表单的值,这次我们输入name等于hello。

回到项目,我们再次使用dump方法来查看一下Request对象。发送请求,我们点击这个preview选项卡。在Request对象的request属性中,我们看到了name参数。我们可以用Request对象的request属性来获取到对应的参数。

再次发送请求,我们看到我们已经获取到了name参数。Symfony为我们提供了另外一个方法,还可以省略十七行十八行的代码,输入dd()方法来查看变量的值。

按着command点击dd()dd()方法是对dump方法和exit方法的一个封装,删掉18行19行代码,再次发送请求,显示的效果是一样的。

继续修改代码,我们希望在/test路径后面添加一个name参数,当我们访问时,让页面显示我们的名字。这里我们修改一下,name这里我们要使用query属性,修改hello word为我们$name变量。

再次刷新页面,我们的名字已经显示了,这就是我们第一个最简单的Symfony页面。

现在我们来深入学习一下,我们看index方法中的Request对象是如何注入到方法中的。我们回到上一节课,在流程图中当Kernel对象接收到Request对象后,会首先找到那个controller方法,再根据controller方法和请求对象来解析它的所有参数。

现在我们来深入学习一下,回到项目,还记得上节课的handleRaw方法吗?我们来双击shift键,输入HttpKernel。如果你的编辑器没有找到这个文件的话,你要勾选这项。

现在我们找到handleRaw方法,在handleRaw方法中,我们下个断点跟踪这段代码。监听xdebug请求,刷新第一个页面。

这时断点就断在了handleRaw方法中,我们看现在的controller方法,它就是TestController的index方法。在这一步它会获取到index方法的所有参数,就是Request这个参数。

我们进入这段代码,我们点击进入,我们看50行51行代码,这是一个双重循环,Symfony会首先根据我们的controller方法获取到所有参数的Metadata,获取完之后进行一项遍历,因为controller方法的参数可以有很多种类型,Symfony也针对不同的参数类型提供了不同的解析器。

点击左边Controller文件夹,文件夹下有个ArgumentResolver文件夹。点击,下面提供了很多种的resolver解析器,我们当前controller(口误)方法的参数只有一个Request对象

它会使用RequestValueResolver对象来处理这个参数。

我们在56行下断点,点击左下角执行,它断到了56行,我们再看这个$resolver变量,$resolve变量它指向的就是RequestValueResolver类。它是这个类的一个实例,我们进入这个类查看一下代码如何执行。

找到RequestValueResolver类,我们看一下supports方法。我们参数的类型是Request类型,它就往下执行,在resolve方法中,直接返回了Symfony已经封装好的Request对象。所以我们就可以直接在action方法中使用这个Request对象。

handleRaw第151行下断点,我们看一下最后的$arguments参数,直接点击运行。断点停在了151行,我们看$arguments变量,$arguments变量只有一个,它是我们的Request对象。所以我们可以直接在action方法中直接使用这个Request对象来获取所有的请求参数。

我们看第12行代码,这个写法是PHP8.0版本提供的注解的写法,第一个参数是路由指向的路径,第二个参数是路由的名称。

在下一节课,我们将深入的学习一下路径中的占位符如何使用。

本文转载于:https://www.teebb.com/content/debug-and-query-parameters

《Symfony 5全面开发》教程05、http请求的query参数的更多相关文章

  1. Taurus.MVC WebAPI 入门开发教程4:控制器方法及参数定义、获取及基础校验属性【Require】。

    系列目录 1.Taurus.MVC WebAPI  入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...

  2. Android快乐贪吃蛇游戏实战项目开发教程-05虚拟方向键(四)四个三角形按钮

    该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.如何判断点击的是哪个方向键按钮 在上篇教程中我们实现了左边的三角形按钮效果, ...

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

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

  4. Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World。

    系列目录 1.Taurus.MVC WebAPI  入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...

  5. Taurus.MVC WebAPI 入门开发教程3:路由类型和路由映射。

    系列目录 1.Taurus.MVC WebAPI  入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...

  6. Taurus.MVC WebAPI 入门开发教程5:控制器安全校验属性【HttpGet、HttpPost】【Ack】【Token】【MicroService】。

    系列目录 1.Taurus.MVC WebAPI  入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...

  7. Taurus.MVC WebAPI 入门开发教程6:全局控制器DefaultController与全局事件。

    系列目录 1.Taurus.MVC WebAPI  入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...

  8. Taurus.MVC WebAPI 入门开发教程8:WebAPI文档与自动化测试。

    系列目录 1.Taurus.MVC WebAPI  入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...

  9. Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行(含系列目录)。

    前言: Taurus.MVC 微服务版本已经发布了:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单. 以前都是框架发布时写点相关功能点的文章,没有形成 ...

随机推荐

  1. 【重构前端知识体系之HTML】HTML5给网页音频带来的变化

    [重构前端知识体系之HTML]HTML5给网页音频带来的变化 引言 音乐播放,相信大家都很熟悉,但是早在之前的音乐播放之前,你的浏览器会问你,是否下载flash插件.然而现在,估计一些年轻的开发者都不 ...

  2. SQL语句 order by 升序和 降序查询

    原文 https://blog.csdn.net/u010649766/article/details/76180523?utm_medium=distribute.pc_relevant_t0.no ...

  3. Codeforces Round #739 (Div. 3)

    A. Dislike of Threes 简单的水题,预处理即可 AC_CODE #include <bits/stdc++.h> using namespace std; templat ...

  4. HowToDoInJava 其它教程 1 &#183; 翻译完成

    原文:HowToDoInJava 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. ApacheCN 学习资源 目录 Maven 教程 如何在 ...

  5. Redis源码简要分析

    转载请注明来源:https://www.cnblogs.com/hookjc/ 把所有服务端文件列出来,并且标示出其作用:adlist.c //双向链表ae.c //事件驱动ae_epoll.c // ...

  6. 判断js对象是否为空

    let _isEmptyObj = function(obj) { for(var key in obj) { return false; } return true; }

  7. DockerClient端与DockerDaemon的通信安全

    DockerClient端与DockerDaemon的通信安全 容器的安全性问题的根源在于容器和宿主机共享内核.如果容器里的应用导致Linux内核崩溃,那么整个系统可能都会崩溃.与虚拟机是不同的,虚拟 ...

  8. Java四舍五入保留n位小数的常用写法

    1. 使用BigDecimal double v = 1.233; double res = new BigDecimal(v).setScale(2, RoundingMode.HALF_UP).d ...

  9. Linux忘记Root密码怎么找回

    进入1级别,单用户模式 ,修改root密码即可(运行级别不懂看这里) 具体操作如下: 1.开机时按enter键 2.进入GRUB界面 3.输入 e,在引导系统前编辑命令 4.选择第二行 kernel ...

  10. termux vim 配置 自动补全 遇到的问题

    // 自动不全需要安装 pkg install proot -y // 用proot可以为手机没有root的用户来模拟一个root的环境,这里主要是经典的 Linux 文件系统布局上的模拟. //执行 ...