HttpFoundation组件

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.3,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

HttpFoundation组件

HttpFoundation组件为HTTP规范定义了一种面向对象的层。

在PHP中,请求是由一些全局变量($ _GET,$ _POST,带有_file美元,_COOKIE美元,_SESSION美元,…)和一些函数生成的响应(回声,头(),setcookie (),……)。

Symf欧宝娱乐app下载地址ony HttpFoundation组件替换这些默认PHP全局变量和函数的一种面向对象的层。

安装

1
美元作曲家需要symfony / ht欧宝娱乐app下载地址tp-foundation

请注意

如果你安装这个组件之外的Symfony应用程序,你必须要求欧宝娱乐app下载地址供应商/ autoload.php文件在你的代码,使作曲家提供的类加载机制。读这篇文章为更多的细节。

另请参阅

这篇文章解释了如何使用HttpFoundation功能作为一个独立的组件在任何PHP应用程序。在Sy欧宝娱乐app下载地址mfony应用程序都已经配置好了,可以使用了。读了控制器篇文章来了解如何使用这些特性在创建控制器。

请求

最常见的方式来创建一个请求是它基于当前的PHP全局变量createFromGlobals ():

1 2 3
使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;美元请求=请求::createFromGlobals ();

这几乎等同于更详细的,但也更灵活,__construct ()电话:

1 2 3 4 5 6 7 8
美元请求=请求(美元_GET,美元_POST[],美元_COOKIE,美元带有_file,美元_SERVER);

访问请求数据

一个请求对象持有客户端请求的信息。这些信息可以通过访问几个公共属性:

  • 请求:相当于$ _POST;
  • 查询:相当于$ _GET(请求- >查询- >获取美元(“名字”));
  • 饼干:相当于_COOKIE美元;
  • 属性:不等效,所使用的应用程序来存储其他数据(见下面);
  • 文件:相当于带有_file美元;
  • 服务器:相当于$ _SERVER;
  • :主要是等价的一个子集$ _SERVER(请求- >标题- >获取美元(“用户代理”))。

每个属性都是一个ParameterBag实例(或的一个子类),这是一个数据夹类:

所有ParameterBag实例方法来检索和更新他们的数据:

所有()
返回的参数。
键()
返回参数的键。
替换()
替换当前由一组新的参数。
add ()
添加参数。
get ()
返回一个参数的名字。
设置()
设置一个参数的名字。
有()
返回真正的如果参数是定义。
remove ()
删除一个参数。

ParameterBag实例也有一些方法来过滤输入值:

getAlpha ()
返回参数的字母字符值;
getAlnum ()
返回参数的字母字符和数字值;
getBoolean ()
返回参数值转换为布尔值;
getDigits ()
返回参数值的位数;
getInt ()
返回参数值转换为整数;
filter ()
通过使用PHP过滤器的参数使用filter_var函数。

所有getter需要两个参数:第一个是参数名和第二个是默认值返回,如果参数不存在:

1 2 3 4 5 6 7 8 9 10
/ /查询字符串是“? foo = bar”美元请求- >查询- >get (“foo”);/ /返回“酒吧”美元请求- >查询- >get (“酒吧”);/ /返回null美元请求- >查询- >get (“酒吧”,“记者”);/ /返回“记者”

当PHP进口请求查询,它处理请求参数foo(酒吧)=巴兹在一种特殊的方式创建一个数组。的get ()方法不支持返回数组,所以你需要使用下面的代码:

1 2 3 4 5 6 7 8 9 10 11
/ /查询字符串foo”?(酒吧)=巴兹'/ /不使用请求- >查询- >获取美元(“foo”);使用以下:美元请求- >查询- >所有()(“foo”];/ /返回['酒吧' = > '巴兹']美元请求- >查询- >get (“foo(酒吧)”);/ /返回null美元请求- >查询- >所有()(“foo”][“酒吧”];/ /返回“记者”

5.1

数组的支持get ()方法在Symfony 5.1中弃用。欧宝娱乐app下载地址

由于公共属性财产,你可以额外的数据存储在请求,也是的一个实例ParameterBag。这主要是用于附加信息,属于请求,需要在应用程序中从许多不同的访问点。

最后,原始数据发送请求主体可以访问使用getContent ():

1
美元内容=美元请求- >getContent ();

例如,这可能是有用的处理一个XML字符串发送到应用程序的远程服务使用HTTP POST方法。

如果请求的身体是一个JSON字符串,它可以访问使用toArray ():

1
美元数据=美元请求- >toArray ();

5.2

toArray ()方法是在Symfony 5.2中引入的。欧宝娱乐app下载地址

识别一个请求

在您的应用程序,您需要一种方法来确定一个请求;大多数时候,这是通过请求的路径信息”,可以通过访问getPathInfo ()方法:

1 2 3
/ /请求到http://example.com/blog/index.php/post/hello-world/ /路径信息是“/ post / hello world”美元请求- >getPathInfo ();

模拟一个请求

而不是创建一个请求基于PHP的全局变量,你也可以模拟一个请求:

1 2 3 4 5
美元请求=请求::创建(' / hello world ',“得到”,(“名字”= >“法”]);

create ()方法基于一个URI创建一个请求,一个方法和一些参数(查询参数或根据HTTP请求的方法);当然,你也可以覆盖所有其他变量(默认情况下,Symfony创建合理的默认值为所有PHP全局变量)。欧宝娱乐app下载地址

基于这样的要求,你可以通过覆盖全球的PHP变量overrideGlobals ():

1
美元请求- >overrideGlobals ();

提示

你也可以通过复制现有的请求复制()或改变一些参数调用初始化()

访问会话

如果你有一个会话请求,您可以通过访问它getSession ()的方法请求RequestStack类;的hasPreviousSession ()方法告诉你如果请求包含一个会话开始在前面的请求。

处理HTTP标头

处理HTTP头并不是一件容易的事情,因为逃避和空白处理的内容。欧宝娱乐app下载地址Symfony提供了一个HeaderUtils类抽象这种复杂性和定义了一些方法最常见的任务:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24日25
使用欧宝娱乐app下载地址\组件\HttpFoundation\HeaderUtils;/ /将一个HTTP头由一个或多个分隔符HeaderUtils::分(“哒、en; q = 0.8”,”,,“);/ / = > [[“da”], [en, ' q = 0.8 ']]/ /数组的数组组合到一个关联数组中HeaderUtils::结合([[“foo”,“abc”]、[“酒吧”]]);/ / = > [“foo”= >“abc”,“酒吧”= > true)/ /连接成一个字符串关联数组用于HTTP头HeaderUtils::toString ([“foo”= >“abc”,“酒吧”= >真正的,“记者”= >“a b c”),”、“);/ / = > ' foo = abc,酒吧,巴兹=“a b c”/ /编码一个字符串作为引用的字符串,如果必要的HeaderUtils::报价(“foo”栏“”);/ / = >“foo \”栏\”“”/ /解码一个引用字符串HeaderUtils::结束(“foo \”栏\”“”);/ / = >“foo”栏“”/ /解析查询字符串,但维护点(PHP parse_str()替换”。”“_”)HeaderUtils::parseQuery (“foo [bar.baz] = qux”);/ / = > [“foo”= >['酒吧。巴兹' = > ' qux ']]

5.2

parseQuery ()方法是在Symfony 5.2中引入的。欧宝娱乐app下载地址

访问接受- *头数据

您可以访问基本数据提取接受- *头用以下方法:

getAcceptableContentTypes ()
返回接受内容类型的列表命令下行质量。
getLanguages ()
返回接受语言命令的列表质量下降。
getCharsets ()
返回接受数据集的列表命令下行质量。
getEncodings ()
返回的列表接受编码下令下行质量。

如果你需要完全访问解析数据接受,接收语言,Accept-Charset接受编码,你可以使用AcceptHeader工具类:

1 2 3 4 5 6 7 8 9 10 11 12
使用欧宝娱乐app下载地址\组件\HttpFoundation\AcceptHeader;美元acceptHeader= AcceptHeader::fromString (美元请求- >- >get (“接受”));如果(美元acceptHeader- >有(“text / html”)){美元=美元acceptHeader- >get (“text / html”);美元字符集=美元- >getAttribute (“字符集”,“utf - 8”);美元质量=美元- >getQuality ();}/ / Accept标头项质量按降序排序美元acceptHeaders= AcceptHeader::fromString (美元请求- >- >get (“接受”))- >所有();

默认值,可以可选地包括在接受- *头也支持:

1 2 3 4 5
美元acceptHeader=文本/平原;q = 0.5, text / html、文本/ *;q = 0.8 * / *; q = 0.3 ';美元接受= AcceptHeader::fromString (美元acceptHeader);美元质量=美元接受- >get (“text / xml”)- >getQuality ();/ /质量= 0.8美元美元质量=美元接受- >get (“application / xml”)- >getQuality ();/ /质量= 0.3美元

匿名的IP地址

日益常见的应用程序需要遵守用户保护法规是匿名化IP地址之前记录和存储进行分析的目的。使用匿名化()方法从IpUtils这样做:

1 2 3 4 5 6 7 8 9
使用欧宝娱乐app下载地址\组件\HttpFoundation\IpUtils;美元ipv4=“123.234.235.236”;美元anonymousIpv4= IpUtils::匿名化(美元ipv4);/ /美元anonymousIpv4 = ' 123.234.235.0 '美元ipv6=“2 a01:198:603:10:396e: 4789:8e99:890f”;美元anonymousIpv6= IpUtils::匿名化(美元ipv6);/ /美元anonymousIpv6 = ' 2 a01:198:603:10::“

访问其他数据

请求类有许多其他方法,您可以使用它们来访问请求信息。看一看请求API更多关于他们的信息。

压倒一切的请求

请求类不应该覆盖,因为它是一个数据对象,它是一个HTTP消息。但从遗留系统时,添加方法或修改一些默认的行为可能会有帮助。在这种情况下,注册一个PHP调用创建的实例请求类:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24
使用应用程序\Http\SpecialRequest;使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;请求::setFactory (函数(数组美元查询=[]数组美元请求=[]数组美元属性=[]数组美元饼干=[]数组美元文件=[]数组美元服务器= [],美元内容= null){返回SpecialRequest (美元查询,美元请求,美元属性,美元饼干,美元文件,美元服务器,美元内容);});美元请求=请求::createFromGlobals ();

响应

一个响应对象持有的所有信息需要从给定请求发送回客户机。构造函数接受三个参数:响应内容,状态代码,和HTTP头的数组:

1 2 3 4 5 6 7
使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;美元响应=响应(“内容”、响应::并,“内容类型”= >“text / html”]);

这些信息也可以操纵响应对象创建后:

1 2 3 4 5 6
美元响应- >setContent (“Hello World”);/ / ResponseHeaderBag头公共属性美元响应- >- >集(“内容类型”,“文本/普通”);美元响应- >setStatusCode(响应::HTTP_NOT_FOUND);

当设置内容类型的反应,你可以设置字符集,但最好是通过setCharset ()方法:

1
美元响应- >setCharset (“iso - 8859 - 1”);

注意,默认情况下,Symfony假定你的反应欧宝娱乐app下载地址是用utf - 8编码。

发送响应

在发送响应之前,您可以调用准备()方法来解决任何与HTTP规范(例如,一个错误的不相容内容类型头):

1
美元响应- >准备(美元请求);

发送响应给客户端通过调用方法send ():

1
美元响应- >send ();

设置cookie

响应可以通过操纵饼干公共属性:

1 2 3
使用欧宝娱乐app下载地址\组件\HttpFoundation\饼干;美元响应- >- >setCookie(饼干::创建(“foo”,“酒吧”));

setCookie ()方法取的一个实例饼干作为参数。

你可以明确一个cookie通过clearCookie ()方法。

除了饼干:create ()方法,您可以创建一个饼干对象从原始头值使用fromString ()方法。您还可以使用* ()方法改变一些饼干房地产(或构建整个饼干使用连贯接口)。每一个* ()方法返回一个新的对象与修改后的属性:

1 2 3 4 5
美元饼干=饼干::创建(“foo”)- >withValue (“酒吧”)- >withExpires (strtotime (“星期五,20 - 2011年5月——15:25:52格林尼治时间”))- >withDomain (“.example.com”)- >withSecure (真正的);

5.1

* ()方法在Symfony 5.1中引入的。欧宝娱乐app下载地址

管理HTTP缓存

响应类具有一组功能丰富的方法来操作相关的HTTP头信息缓存:

请注意

的方法setExpires (),setLastModified ()设置当前日期()接受任何对象实现\ DateTimeInterface,包括不变的日期对象。

setCache ()方法可用于设置最常用的一个方法调用的缓存信息:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
美元响应- >setCache ([“must_revalidate”= >,“no_cache”= >,“no_store”= >,“no_transform”= >,“公共”= >真正的,“私人”= >,“proxy_revalidate”= >,“max_age”= >600年,“s_maxage”= >600年,“不变”= >真正的,“last_modified”= >\ DateTime (),“etag”= >“六边形abcdef”]);

5.1

must_revalidate,no_cache,no_store,no_transformproxy_revalidate指令在Symfony 5.1中引入的。欧宝娱乐app下载地址

检查如果响应验证器(ETag,last - modified)匹配客户机请求中指定一个条件值,使用isNotModified ()方法:

1 2 3
如果(美元响应- >isNotModified (美元请求)){美元响应- >send ();}

如果响应不修改,设置状态代码304,删除实际的响应内容。

重定向用户

重定向客户端到另一个URL,您可以使用RedirectResponse类:

1 2 3
使用欧宝娱乐app下载地址\组件\HttpFoundation\RedirectResponse;美元响应=RedirectResponse (“http://example.com/”);

流媒体的回应

StreamedResponse类允许您流回客户机的响应。响应内容由PHP调用而不是一个字符串:

1 2 3 4 5 6 7 8 9 10 11
使用欧宝娱乐app下载地址\组件\HttpFoundation\StreamedResponse;美元响应=StreamedResponse ();美元响应- >setCallback (函数(){var_dump (“Hello World”);冲洗();睡眠(2);var_dump (“Hello World”);冲洗();});美元响应- >send ();

请注意

冲洗()函数不冲洗缓冲。如果ob_start ()或者是之前被称为output_bufferingphp . ini选择启用,您必须调用ob_flush ()之前冲洗()

另外,PHP并不是唯一的层,可以缓冲输出。您的web服务器也可能根据其配置缓冲。一些服务器,比如nginx,让你禁用缓冲配置级别或通过添加一个特殊的HTTP头的反应:

1 2
/ /禁用FastCGI缓冲nginx只响应美元响应- >- >集(“X-Accel-Buffering”,“不”);

服务文件

发送一个文件时,您必须添加一个附加项头给你回应。在创建这个头基本文件下载很简单,使用非ascii文件名是更多的参与。的makeDisposition ()摘要背后的辛勤工作一个简单的API:

1 2 3 4 5 6 7 8 9 10 11 12 13
使用欧宝娱乐app下载地址\组件\HttpFoundation\HeaderUtils;使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;使用欧宝娱乐app下载地址\组件\HttpFoundation\ResponseHeaderBag;美元fileContent=……;/ /生成的文件内容美元响应=响应(美元fileContent);美元性格= HeaderUtils::makeDisposition (HeaderUtils::DISPOSITION_ATTACHMENT,“foo.pdf”);美元响应- >- >集(“附加”,美元性格);

或者,如果你是为一个静态文件,您可以使用一个BinaryFileResponse:

1 2 3 4
使用欧宝娱乐app下载地址\组件\HttpFoundation\BinaryFileResponse;美元文件=“路径/ / file.txt”;美元响应=BinaryFileResponse (美元文件);

BinaryFileResponse会自动处理范围If-Range头从请求。它还支持X-Sendfile(见nginxApache)。使用它,您需要确定是否X-Sendfile-Type头应该信任和电话trustXSendfileTypeHeader ()如果它应该:

1
BinaryFileResponse::trustXSendfileTypeHeader ();

请注意

BinaryFileResponse只会处理X-Sendfile如果存在特定的头。对于Apache,这不是默认情况。

添加标题使用mod_headersApache模块和Apache配置添加以下:

1 2 3 4 5 6 7 8 9 10
< IfModule mod_xsendfile.c >#这是已经存在某个地方……XSendFileXSendFilePath…一些道路…#这需要补充道:< IfModule mod_headers.c >RequestHeader设置X-Sendfile-Type X-Sendfile< / IfModule >< / IfModule >

BinaryFileResponse,你还可以设置内容类型发送的文件,或改变它附加项:

1 2 3 4 5 6
/ /……美元响应- >- >集(“内容类型”,“文本/普通”);美元响应- >setContentDisposition (ResponseHeaderBag::DISPOSITION_ATTACHMENT,“filename.txt”);

可以删除文件的响应发送后deleteFileAfterSend ()方法。请注意,这将不是工作时X-Sendfile头被设置。

如果服务文件的大小是未知的(例如,因为它是动态生成的,或者因为一个PHP流过滤注册,等等),你可以通过实例BinaryFileResponse。这将禁用范围内容长度处理,切换到分块编码:

1 2 3 4 5
使用欧宝娱乐app下载地址\组件\HttpFoundation\BinaryFileResponse;使用欧宝娱乐app下载地址\组件\HttpFoundation\文件\;美元=流(的路径/ /流);美元响应=BinaryFileResponse (美元);

请注意

如果你只是文件在同一请求,创建文件可能发送没有任何内容。这可能是由于缓存文件数据文件的大小,返回0。为了解决这个问题,电话函数(真的,$文件)二进制文件的路径。

创建一个JSON响应

可以通过创建任何类型的反应响应类通过设置正确的内容和标题。一个JSON响应可能会看起来像这样:

1 2 3 4 5 6 7
使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;美元响应=反应();美元响应- >setContent (json_encode ([“数据”= >123年)));美元响应- >- >集(“内容类型”,“application / json”);

也有帮助JsonResponse类,它可以使这更容易:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
使用欧宝娱乐app下载地址\组件\HttpFoundation\JsonResponse;/ /如果你知道发送的数据在创建响应美元响应=JsonResponse ([“数据”= >123年]);/ /如果你不知道数据发送或如果你想自定义编码选项美元响应=JsonResponse ();/ /……/ /配置任何自定义编码选项(如果需要,它之前必须被称为“setData ())/ / $响应- > setEncodingOptions (JsonResponse: DEFAULT_ENCODING_OPTIONS | \ JSON_PRESERVE_ZERO_FRACTION);美元响应- >setData ([“数据”= >123年]);/ /如果数据发送已经用JSON编码美元响应= JsonResponse::fromJsonString (“{“数据”:123}”);

JsonResponse类集内容类型头来application / json并将数据编码为JSON。

谨慎

为了避免XSSIJSON劫持,你应该通过一个关联数组作为最外层数组JsonResponse而不是一个索引数组,这样最后的结果是一个对象(如{“对象”:“不是内部数组”}),而不是(例如数组。[{“对象”:“内部数组”}])。读了OWASP指南为更多的信息。

只响应GET请求的方法容易受到XSSI JSON劫持。方法只对POST请求不受影响。

JSONP回调

如果你使用JSONP,你可以设置回调函数,数据应该传递给:

1
美元响应- >setCallback (“handleResponse”);

在这种情况下,内容类型头会text / javascript和响应内容是这样的:

1
handleResponse ({“数据”:123年});

会话

会话信息在自己的文档:会话管理

安全内容的偏好

一些网站有一个“安全”的方式帮助那些不想被他们可能接触到的内容对象。的RFC 8674规范定义了一种用户代理服务器要求安全内容。

规范中没有定义内容可能被视为令人反感的,所以“安全”的概念不是精确定义。相反,这个词是由服务器解释和每个网站的范围内选择行动这个信息。

欧宝娱乐app下载地址Symfony提供了两个方法与此首选项:

5.1

preferSafeContent ()setContentSafe ()方法在Symfony 5.1中引入的。欧宝娱乐app下载地址

下面的例子显示了如何检测用户代理更喜欢“安全”内容:

1 2 3 4 5 6 7
如果(美元请求- >preferSafeContent ()) {美元响应=响应(美元alternativeContent);/ /这个告知用户我们尊重他们的选择美元响应- >setContentSafe ();返回美元响应;}
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
欧宝娱乐app下载地址Symfony 5.3支持通过JoliCode