HttpFoundation组件
编辑本页HttpFoundation组件
HttpFoundation组件为HTTP规范定义了一个面向对象的层。
在PHP中,请求由一些全局变量表示($ _GET
,$ _POST
,带有_file美元
,_COOKIE美元
,_SESSION美元
,…),响应由一些函数(回声
,头()
,setcookie ()
,……)。
Symfob娱乐下载ony HttpFoundation组件用面向对象层替换了这些默认的PHP全局变量和函数。
安装
1
$作曲家需要symfony/httpob娱乐下载-foundation
请注意
如果在Symfony应用程序外部安装此组件,则必须要求ob娱乐下载供应商/ autoload.php
文件,以启用Composer提供的类自动加载机制。读这篇文章欲知详情。
另请参阅
本文解释了如何在任何PHP应用程序中使用HttpFoundation特性作为一个独立的组件。在Syob娱乐下载mfony应用程序中,一切都已经配置好,可以使用了。读了控制器文章以了解在创建控制器时如何使用这些特性。
请求
创建请求的最常用方法是基于当前的PHP全局变量createFromGlobals ():
1 2 3
使用ob娱乐下载\组件\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或InputBag如果数据来自$ _POST
参数;查询
:InputBag;饼干
:InputBag;属性
:ParameterBag;文件
:FileBag;服务器
:ServerBag;头
:HeaderBag.
所有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(酒吧)=巴兹
以一种特殊的方式创建数组。的get ()
方法不支持返回数组,因此您需要使用以下代码:
1 2 3 4 5 6 7 8 9 10 11
//查询字符串为'?foo(酒吧)=巴兹'//不使用$request->query->get('foo');请使用以下语句:$请求->查询->所有()(“foo”];//返回['bar' => 'baz']$请求->查询->get (“foo(酒吧)”);//返回null$请求->查询->所有()(“foo”] [“酒吧”];//返回'baz'
5.1
数组支持get ()
方法在Symfony 5.1中已弃用。ob娱乐下载
感谢公众属性
属性的实例,则可以在请求中存储其他数据,该请求也是ParameterBag.这主要用于附加属于请求的信息,并且需要从应用程序中的许多不同点访问这些信息。
最后,与请求体一起发送的原始数据可以使用getContent ():
1
$内容=$请求->getContent ();
例如,这对于处理远程服务使用HTTP POST方法发送给应用程序的XML字符串可能很有用。
如果请求体是JSON字符串,则可以使用toArray ():
1
$数据=$请求->toArray ();
5.2
的toArray ()
方法是在Symfony 5.2中引入的。ob娱乐下载
识别请求
在您的应用程序中,您需要一种方法来识别请求;大多数情况下,这是通过请求的“路径信息”来完成的,可以通过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全局变量创建合理的默认值)。ob娱乐下载
基于这样的请求,您可以通过重写PHP全局变量overrideGlobals ():
1
$请求->overrideGlobals ();
访问会话
方法将会话附加到请求,则可以通过getSession ()
方法请求或RequestStack类;的hasPreviousSession ()方法告诉您请求是否包含在以前的一个请求中启动的会话。
处理HTTP报头
处理HTTP标头不是一项简单的任务,因为它们的内容有转义和空白处理。ob娱乐下载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
使用ob娱乐下载\组件\HttpFoundation\HeaderUtils;//使用一个或多个分隔符分隔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中引入的。ob娱乐下载
访问接受- *
头数据
您可以访问提取的基本数据接受- *
头文件,使用以下方法:
- getAcceptableContentTypes ()
- 返回按质量降序排序的可接受内容类型列表。
- getLanguages ()
- 返回按质量降序排序的可接受语言列表。
- getCharsets ()
- 返回按质量降序排序的可接受字符集列表。
- getEncodings ()
- 返回按质量降序排列的可接受编码列表。
如果您需要获得解析数据的完全访问权接受
,接收语言
,Accept-Charset
或接受编码
,你可以使用AcceptHeader工具类:
12 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载\组件\HttpFoundation\AcceptHeader;$acceptHeader= 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
使用ob娱乐下载\组件\HttpFoundation\IpUtils;$ipv4=“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::'
重写请求
的请求
类不应该被重写,因为它是表示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
使用应用程序\Http\SpecialRequest;使用ob娱乐下载\组件\HttpFoundation\请求;请求::setFactory (函数(数组$查询=[],数组$请求=[],数组$属性=[],数组$饼干=[],数组$文件=[],数组$服务器= [],$内容= null){返回新SpecialRequest ($查询,$请求,$属性,$饼干,$文件,$服务器,$内容);});$请求=请求::createFromGlobals ();
响应
一个响应对象保存了需要从给定请求发送回客户机的所有信息。构造函数最多接受三个参数:响应内容、状态代码和HTTP报头数组:
1 2 3 4 5 6 7
使用ob娱乐下载\组件\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假设您的响ob娱乐下载应是用UTF-8编码的。
发送响应
在发送响应之前,您可以选择调用准备()方法来修复与HTTP规范的任何不兼容(例如错误的内容类型
头):
1
$响应->准备($请求);
将响应发送到客户机是通过调用该方法完成的send ():
1
$响应->send ();
设置cookie
控件可以对响应cookie进行操作头
公共属性:
1 2 3
使用ob娱乐下载\组件\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中引入的。ob娱乐下载
管理HTTP缓存
的响应类有一组丰富的方法来操作与缓存相关的HTTP头:
- setPublic ()
- setPrivate ()
- (到期)
- setExpires ()
- setMaxAge ()
- setSharedMaxAge ()
- setTtl ()
- setClientTtl ()
- setLastModified ()
- setEtag ()
- setVary ()
请注意
的方法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_revalidate
,no_cache
,no_store
,no_transform
而且proxy_revalidate
指令在Symfony 5.1中引入。ob娱乐下载
要检查响应验证器(ETag
,last - modified
)匹配客户端请求中指定的条件值,使用isNotModified ()方法:
1 2 3
如果($响应->isNotModified ($请求)) {$响应->send ();}
如果没有修改Response,它将状态代码设置为304并删除实际的响应内容。
重定向用户
要将客户端重定向到另一个URL,可以使用RedirectResponse类:
1 2 3
使用ob娱乐下载\组件\HttpFoundation\RedirectResponse;$响应=新RedirectResponse (“http://example.com/”);
流媒体响应
的StreamedResponse类允许您将响应流回客户端。响应内容由PHP可调用对象而不是字符串表示:
1 2 3 4 5 6 7 8 9 10 11
使用ob娱乐下载\组件\HttpFoundation\StreamedResponse;$响应=新StreamedResponse ();$响应->setCallback (函数(){var_dump (“Hello World”);冲洗();睡眠(2);var_dump (“Hello World”);冲洗();});$响应->send ();
请注意
的冲洗()
函数不刷新缓冲。如果ob_start ()
之前被调用过还是output_buffering
php . 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
使用ob娱乐下载\组件\HttpFoundation\HeaderUtils;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\HttpFoundation\ResponseHeaderBag;$fileContent=……;//生成的文件内容$响应=新响应($fileContent);$性格= HeaderUtils::makeDisposition (HeaderUtils::DISPOSITION_ATTACHMENT,“foo.pdf”);$响应->头->集(“附加”,$性格);
或者,如果您正在提供静态文件,则可以使用BinaryFileResponse:
1 2 3 4
使用ob娱乐下载\组件\HttpFoundation\BinaryFileResponse;$文件=“路径/ / file.txt”;$响应=新BinaryFileResponse ($文件);
的BinaryFileResponse
会自动处理范围
而且If-Range
来自请求的头文件。它还支持X-Sendfile
(见nginx而且Apache).要使用它,您需要确定是否X-Sendfile-Type
头应受信任并调用trustXSendfileTypeHeader ()如果应该:
1
BinaryFileResponse::trustXSendfileTypeHeader ();
请注意
的BinaryFileResponse
只会处理X-Sendfile
是否存在特定的标头。对于Apache,这不是默认情况。
要添加标头,使用mod_headers
Apache模块,并将以下内容添加到Apache配置:
1 2 3 4 5 6 7 8 9 10
< IfModule mod_xsendfile.c >#这已经在某个地方出现了……XSendFile在XSendFilePath...一些道路…#需要添加:< 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
使用ob娱乐下载\组件\HttpFoundation\BinaryFileResponse;使用ob娱乐下载\组件\HttpFoundation\文件\流;$流=新流(的路径/ /流);$响应=新BinaryFileResponse ($流);
请注意
如果你只是在同一请求期间创建了文件,即文件五月发送时不包含任何内容。这可能是由于缓存的文件统计数据返回文件大小为零。若要修复此问题,请拨打函数(真的,$文件)
二进制文件的路径。
创建JSON响应
方法可以创建任何类型的响应响应通过设置正确的内容和标头来初始化。JSON响应可能是这样的:
1 2 3 4 5 6 7
使用ob娱乐下载\组件\HttpFoundation\响应;$响应=新反应();$响应->setContent (json_encode ([“数据”= >123)));$响应->头->集(“内容类型”,“application / json”);
还有一个有用的JsonResponse类,这可以使这更容易:
12 3 4 5 6 7 8 9 10 11 12 13 14
使用ob娱乐下载\组件\HttpFoundation\JsonResponse;//如果你知道在创建响应时要发送的数据$响应=新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。
JSONP回调
如果你正在使用JSONP,你可以设置数据应该传递给的回调函数:
1
$响应->setCallback (“handleResponse”);
在这种情况下,内容类型
Header将为text / javascript
响应内容看起来像这样:
1
handleResponse ({“数据”:123});
安全内容偏好
一些网站有一个“安全”模式,以帮助那些不想暴露在他们可能反对的内容。的RFC 8674规范定义了用户代理向服务器请求安全内容的方法。
该规范没有定义哪些内容可能被认为是令人反感的,因此“安全”的概念没有精确定义。相反,这个术语是由服务器解释的,并且在每个选择对该信息采取行动的网站的范围内。
ob娱乐下载Symfony提供了两种与该首选项交互的方法:
5.1
的preferSafeContent ()
而且setContentSafe ()
方法是在Symfony 5.1中引入的。ob娱乐下载
下面的例子显示了如何检测用户代理是否更喜欢“安全”的内容:
1 2 3 4 5 6
如果($请求->preferSafeContent ()) {$响应=新响应($alternativeContent);//这告诉用户我们尊重他们的偏好$响应->setContentSafe ();返回$响应;
生成相对和绝对url
5.4
生成相对和绝对url的特性是在Symfony 5.4中引入的。ob娱乐下载
在某些应用程序中,为给定路径生成绝对和相对url是一种常见需求。在Twig模板中,您可以使用absolute_url ()而且relative_path ()函数来做这个。
的UrlHelper类为PHP代码提供了相同的功能getAbsoluteUrl ()
而且getRelativePath ()
方法。你可以把它作为服务注入到你的应用程序的任何地方:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
/ / src /标准化者/ UserApiNormalizer.php名称空间应用程序\标准化者;使用ob娱乐下载\组件\HttpFoundation\UrlHelper;类UserApiNormalizer{私人UrlHelper$urlHelper;公共函数__construct(UrlHelper$urlHelper){$这->urlHelper =$urlHelper;}公共函数正常化($用户){返回[《阿凡达》= >$这->urlHelper->getAbsoluteUrl ($用户->《阿凡达》()->路径()));}}