HttpFoundation组件

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.2,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

HttpFoundation组件

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

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

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

安装

1
作曲家需要symfony/http欧宝娱乐app下载地址-foundation

请注意

如果在Symfony应用程序外部安装此组件,则必须要求欧宝娱乐app下载地址供应商/ autoload.php文件,以启用Composer提供的类自动加载机制。读这篇文章欲知详情。

另请参阅

本文解释了如何在任何PHP应用程序中使用HttpFoundation特性作为一个独立的组件。在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);

访问请求数据

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

  • 请求:等于$ _POST
  • 查询:等于$ _GET请求- >查询- >获取美元(“名字”));
  • 饼干:等于_COOKIE美元
  • 属性:没有等价物-被你的应用程序用来存储其他数据(见下面);
  • 文件:等于带有_file美元
  • 服务器:等于$ _SERVER
  • 的一个子集$ _SERVER请求- >标题- >获取美元(“用户代理”)).

每个属性都是ParameterBag实例(或的子类),它是一个数据持有者类:

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

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

ParameterBagInstance也有一些过滤输入值的方法:

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

所有的getter都有两个参数:第一个是参数名,第二个是参数不存在时返回的默认值:

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

当PHP导入请求查询时,它处理如下请求参数foo(酒吧)=巴兹以一种特殊的方式创建数组。所以你可以得到喷火参数,你会得到一个数组酒吧元素:

1 2 3 4 5 6 7 8 9 10
//查询字符串为'?foo(酒吧)=巴兹'请求->查询->get (“foo”);//返回['bar' => 'baz']请求->查询->get (“foo(酒吧)”);//返回null请求->查询->get (“foo”)[“酒吧”];//返回'baz'

感谢公众属性属性的实例,则可以在请求中存储其他数据,该请求也是ParameterBag.这主要用于附加属于请求的信息,并且需要从应用程序中的许多不同点访问这些信息。

最后,与请求体一起发送的原始数据可以使用getContent ()

1
内容请求->getContent ();

例如,这对于处理远程服务使用HTTP POST方法发送给应用程序的XML字符串可能很有用。

如果请求体是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 ()method根据URI、方法和一些参数(查询参数或请求参数取决于HTTP方法)创建一个请求;当然,您也可以覆盖所有其他变量(默认情况下,Symfony为所有PHP全局变量创建合理的默认值)。欧宝娱乐app下载地址

基于这样的请求,您可以通过重写PHP全局变量overrideGlobals ()

1
请求->overrideGlobals ();

提示

您还可以通过复制现有的请求复制()或者用一个调用改变一堆参数初始化()

访问会话

方法将会话附加到请求,则可以通过getSession ()方法;的hasPreviousSession ()方法告诉您请求是否包含在以前的一个请求中启动的会话。

处理HTTP报头

处理HTTP标头不是一项简单的任务,因为它们的内容有转义和空白处理。欧宝娱乐app下载地址Symfony提供了一个HeaderUtils类,它抽象了这种复杂性,并为最常见的任务定义了一些方法:

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

5.2

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

访问接受- *头数据

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

getAcceptableContentTypes ()
返回按质量降序排序的可接受内容类型列表。
getLanguages ()
返回按质量降序排序的可接受语言列表。
getCharsets ()
返回按质量降序排序的可接受字符集列表。
getEncodings ()
返回按质量降序排列的可接受编码列表。

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

12 3 4 5 6 7 8 9 10 11 12
使用欧宝娱乐app下载地址组件HttpFoundationAcceptHeaderacceptHeader= AcceptHeader::fromString (请求->->get (“接受”));如果acceptHeader->有(“text / html”)) {acceptHeader->get (“text / html”);字符集->getAttribute (“字符集”“utf - 8”);质量->getQuality ();}//接收头项按降序排序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 ();// $quality = 0.8质量接受->get (“application / xml”->getQuality ();// $quality = 0.3

匿名IP地址

应用程序遵守用户保护法规的一个日益普遍的需求是,在记录和存储IP地址以供分析之前匿名化它们。使用匿名化()方法。IpUtils做那件事:

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

访问其他数据

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

重写请求

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

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

响应

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

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

这些信息也可以在Response对象创建后进行操作:

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

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

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

请注意,默认情况下,Symfony假设您的响欧宝娱乐app下载地址应是用UTF-8编码的。

发送响应

在发送响应之前,您可以选择调用准备()方法来修复与HTTP规范的任何不兼容(例如错误的内容类型头):

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

将响应发送到客户机是通过调用该方法完成的send ()

1
响应->send ();

设置cookie

控件可以对响应cookie进行操作公共属性:

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

setCookie ()方法的实例饼干作为一个论证。

您可以通过clearCookie ()方法。

除了饼干:create ()方法时,可以创建饼干对象从原始头值使用fromString ()方法。你也可以使用* ()方法来更改某些Cookie属性(或使用连贯接口构建整个Cookie)。每一个* ()方法返回一个具有modified属性的新对象:

1 2 3 4 5
饼干=饼干::创建(“foo”->withValue (“酒吧”->withExpires (strtotime (“2011年5月20日星期五15:25:52”))->withDomain (“.example.com”->withSecure (真正的);

5.1

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

管理HTTP缓存

响应类有一组丰富的方法来操作与缓存相关的HTTP头:

请注意

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

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

12 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_revalidateno_cacheno_storeno_transform而且proxy_revalidate指令在Symfony 5.1中引入。欧宝娱乐app下载地址

要检查响应验证器(ETaglast - modified)匹配客户端请求中指定的条件值,使用isNotModified ()方法:

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

如果没有修改Response,它将状态代码设置为304并删除实际的响应内容。

重定向用户

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

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

流媒体响应

StreamedResponse类允许您将响应流回客户端。响应内容由PHP可调用对象而不是字符串表示:

1 2 3 4 5 6 7 8 9 10 11
使用欧宝娱乐app下载地址组件HttpFoundationStreamedResponse响应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
//在nginx中只对这个响应禁用FastCGI缓冲响应->->集(“X-Accel-Buffering”“不”);

服务文件

发送文件时,必须添加附加项标题到您的响应。虽然为基本文件下载创建这个头文件很简单,但使用非ascii文件名就比较复杂了。的makeDisposition ()抽象了一个简单API背后的艰苦工作:

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

或者,如果您正在提供静态文件,则可以使用BinaryFileResponse

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

BinaryFileResponse会自动处理范围而且If-Range来自请求的头文件。它还支持X-Sendfile(见nginx而且Apache).要使用它,您需要确定是否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-类型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下载地址组件HttpFoundationBinaryFileResponse使用欧宝娱乐app下载地址组件HttpFoundation文件流(的路径/ /流);响应BinaryFileResponse ();

请注意

如果你只是在同一请求期间创建了文件,即文件五月发送时不包含任何内容。这可能是由于缓存的文件统计数据返回文件大小为零。若要修复此问题,请拨打函数(真的,$文件)二进制文件的路径。

创建JSON响应

方法可以创建任何类型的响应响应通过设置正确的内容和标头来初始化。JSON响应可能是这样的:

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

还有一个有用的JsonResponse类,这可以使这更容易:

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

JsonResponse类设置内容类型头来application / json并在需要时将数据编码为JSON。

谨慎

避免XSSIJSON劫持,您应该将一个关联数组作为最外层数组传递给JsonResponse并且不是一个索引数组,因此最终结果是一个对象(例如。{"object": "不在数组中"})而不是数组(例如。[{"object": "在数组内"}]).读了OWASP指南获取更多信息。

只有响应GET请求的方法才容易受到XSSI“JSON劫持”的攻击。响应POST请求的方法不受影响。

JSONP回调

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

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

在这种情况下,内容类型Header将为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 ();返回响应;}
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。