《Symfony 5全面开发》教程05、http请求的query参数
首先我们删除上节课所下的断点,在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参数的更多相关文章
- Taurus.MVC WebAPI 入门开发教程4:控制器方法及参数定义、获取及基础校验属性【Require】。
系列目录 1.Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...
- Android快乐贪吃蛇游戏实战项目开发教程-05虚拟方向键(四)四个三角形按钮
该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.如何判断点击的是哪个方向键按钮 在上篇教程中我们实现了左边的三角形按钮效果, ...
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World。
系列目录 1.Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...
- Taurus.MVC WebAPI 入门开发教程3:路由类型和路由映射。
系列目录 1.Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...
- Taurus.MVC WebAPI 入门开发教程5:控制器安全校验属性【HttpGet、HttpPost】【Ack】【Token】【MicroService】。
系列目录 1.Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...
- Taurus.MVC WebAPI 入门开发教程6:全局控制器DefaultController与全局事件。
系列目录 1.Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...
- Taurus.MVC WebAPI 入门开发教程8:WebAPI文档与自动化测试。
系列目录 1.Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...
- Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行(含系列目录)。
前言: Taurus.MVC 微服务版本已经发布了:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单. 以前都是框架发布时写点相关功能点的文章,没有形成 ...
随机推荐
- golang中匿名函数的应用-回调函数-闭包
package main import ( "fmt" "strconv" ) type funcType func(int, int) int // 自定义函 ...
- dubbo-gateway 高性能dubbo网关
dubbo-gateway dubbo-gateway 提供了http协议到dubbo协议的转换,但[并非]使用dubbo的[泛化]调用(泛化调用性能比普通调用有10-20%的损耗,通过普通异步的调用 ...
- Vue3 框架基础随笔 (一)
VUE框架基础部分随笔 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架. Vue可以使用简单的代码实现一个单页面应用. 基本格式 Vue通过模板语法来声明式的将数 ...
- 使用 electron 和 electron-forge 加载 本地磁盘资源 img 的问题
最近在学习使用 electron 进行桌面开发一款图片压缩的软件.遇到了加载本地磁盘文件的问题.记录一下其解决方案. 使用 electron 加载本地磁盘文件 第一种方法 设置webPreferenc ...
- 使用ajax登录验证,第一次点击登录按钮无反应,第二次点击才能正常运行。
问题描述: 使用ajax进行登录验证时,第一次点击登录按钮无反应,第二次点击才能进去. 解决方法: 原来的代码 <form action="" method="po ...
- python 小兵(4)之文件操作
文件操作 初始文件操作 使用Python来读写文件是非常简单的操作,我们使用open()函数来打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作了 根据打开方式的不同能够执行的操作 ...
- java代码实现调用短信接口,发送短信验证。
一.代码示例 package com.aaa.zxf.login; import org.apache.commons.httpclient.HttpClient; import org.apache ...
- 如何在pyqt中在实现无边框窗口的同时保留Windows窗口动画效果(一)
无边框窗体的实现思路 在pyqt中只要 self.setWindowFlags(Qt.FramelessWindowHint) 就可以实现边框的去除,但是没了标题栏也意味着窗口大小无法改变.窗口无法拖 ...
- js文件中三斜杠注释///reference path的用途
编辑某个js文件时,要想这个js文件出现其他js成员的ide提示,可以在js文件开头使用3个斜杠注释和reference指令的path指向此js文件路径,这样在编写这个js文件时,ide就会自动出现p ...
- CF1270G Subset with Zero Sum
首先一定要从每个数的范围 \(i - n \le a_i \le i - 1\) 入手,最开始是这样一个想法,不难发现对于每个 \(i\) 都能选 \(n\) 个数,并且能选的右端点在 \(i - 1 ...