httpfoundation组件
httpfoundation组件¶
httpfoundation组件定义了HTTP规范的面向对象层。
在PHP中,请求由一些全局变量($ _GET
那$ _post.
那带有_file美元
那$ _cookie.
那$ _渊源
,......)和响应是由某些功能生成的(回声
那标题()
那setcookie ()
,……)。
Symfob娱乐下载ony HttpFoundation组件用面向对象的层替换了这些默认的PHP全局变量和函数。
安装¶
1 |
$Composer需要Symfonyob娱乐下载 / HTTP-Foundation
|
笔记
如果在Symfony应用程序之外安装此组件,则必须要求ob娱乐下载供应商/ autoload.php.
以启用Composer提供的类自动加载机制。读本文更多细节。
也可以看看
本文介绍如何在任何PHP应用程序中使用HttpFoundation功能作为独立组件。在Syob娱乐下载mfony应用程序中,所有内容都已配置并准备使用。阅读控制器文章了解如何在创建控制器时使用这些功能。
要求¶
创建请求的最常用方式是将其基于当前PHP全局变量createfromglobals()
:
用ob娱乐下载Symfony \ HttpFoundation \ \组件请求;$请求=要求::createfromglobals.();
这几乎等同于更详细,但也更灵活,__构造()
称呼:
$请求=新的要求($ _GET那$ _post.那[],$ _cookie.那带有_file美元那$ _server.);
访问请求数据¶
请求对象保存有关客户端请求的信息。可以通过几个公共属性访问此信息:
请求
:相当于$ _post.
;询问
:相当于$ _GET
($请求 - >查询 - > get('name')
);饼干
:相当于$ _cookie.
;属性
:没有等效的-被你的应用程序用来存储其他数据(见以下);文件
:相当于带有_file美元
;服务器
:相当于$ _server.
;标题
:基本上相当于的子集$ _server.
($请求 - >标题 - > get('用户 - 代理')
)。
每个属性都是一个ob娱乐下载symfony \ component \ httpfoundation \ parameterbag
Instance(或的子类),它是一个数据持有者类:
请求
:ob娱乐下载symfony \ component \ httpfoundation \ parameterbag
或者ob娱乐下载symfony \ component \ httpfoundation \ inputbag
如果数据来自$ _post.
参数;询问
:ob娱乐下载symfony \ component \ httpfoundation \ inputbag
;饼干
:ob娱乐下载symfony \ component \ httpfoundation \ inputbag
;属性
:ob娱乐下载symfony \ component \ httpfoundation \ parameterbag
;文件
:ob娱乐下载symfony \ component \ httpfoundation \ filebag
;服务器
:ob娱乐下载symfony \ component \ httpfoundation \ serverbag
;标题
:ob娱乐下载symfony \ component \ httpfoundation \ headerbag
.
全部ob娱乐下载symfony \ component \ httpfoundation \ parameterbag
实例有检索和更新其数据的方法:
-
全部()
- 返回参数。
-
键()
- 返回参数键。
-
代替()
- 用新参数集替换当前参数。
-
添加()
- 添加参数。
-
get ()
- 按名称返回参数。
-
放()
- 按名称设置参数。
-
具有()
-
回报
真的
如果定义了参数。 -
去掉()
- 删除参数。
这ob娱乐下载symfony \ component \ httpfoundation \ parameterbag
实例还有一些方法来过滤输入值:
-
getAlpha()
- 返回参数值的字母字符;
-
getAlnum()
- 返回参数值的字母字符和数字;
-
getBoolean ()
- 返回转换为布尔的参数值;
-
getDigits()
- 返回参数值的数字;
-
getInt()
- 返回转换为整数的参数值;
-
筛选()
-
使用PHP过滤参数
filter_var.
功能。
所有的getter都最多接受两个参数:第一个是形参名,第二个是当形参不存在时返回的默认值:
//查询字符串是'?foo = bar'$请求- >询问- >得到(“foo”);//返回'bar'$请求- >询问- >得到('酒吧');//返回null.$请求- >询问- >得到('酒吧'那'Baz');/ /返回“记者”
当PHP导入请求查询时,它处理如下请求参数foo [bar] = baz
以一种特殊的方式创建一个数组。所以你可以得到Foo
参数,您将返回一个数组酒吧
元素:
//查询字符串是'?foo [bar] = baz'$请求- >询问- >得到(“foo”);//返回['bar'=>'baz']$请求- >询问- >得到('foo [bar]');//返回null.$请求- >询问- >得到(“foo”)['酒吧'];/ /返回“记者”
感谢公众属性
属性,您可以在请求中存储额外的数据,它也是ob娱乐下载symfony \ component \ httpfoundation \ parameterbag
.这主要用于附加属于请求的信息,需要从应用程序中的许多不同点访问这些信息。
最后,可以使用使用请求主体发送的原始数据getContent()
:
$内容=$请求- >GetContent.();
例如,这对于处理使用HTTP POST方法的远程服务发送给应用程序的XML字符串可能很有用。
如果请求正文是JSON字符串,则可以访问它toarray()
:
$数据=$请求- >Toarray.();
5.2版中的新增功能:这toarray()
在Symfony 5.2中引入了方法。ob娱乐下载
识别一个请求¶
在您的应用程序中,您需要一种识别请求的方法;大多数情况下,这是通过请求的“路径信息”完成,可以通过getpathinfo()
方法:
//对于http://example.com/blog/index.php/post/hello-world的请求// Path Info是“/ post / hello-world”$请求- >getPathInfo();
模拟一个请求¶
您还可以模拟请求:
$请求=要求::创造('/你好,世界'那'得到'那['名称'=>'fabien']);
这create ()
方法基于URI、方法和一些参数(查询参数或请求参数取决于HTTP方法)创建一个请求;当然,您也可以覆盖所有其他变量(默认情况下,Symfony为所有PHP全局变量创建合理的默认值)。ob娱乐下载
基于此类请求,您可以通过覆盖PHP全局变量overrideglobals()
:
$请求- >覆盖玻璃();
访问会话¶
如果您对请求附加了会话,则可以通过getsession()
法或者getsession()
方法;这hasPreviousSession ()
方法告诉您该请求是否包含在上一个请求之一中启动的会话。
处理HTTP标题¶
由于其内容的逃逸和白色空间处理,处理HTTP标题不是一个简单的任务。ob娱乐下载Symfony提供A.ob娱乐下载symfony \ component \ httpfoundation \标题
摘要摘要这种复杂性并为最常见的任务定义了一些方法:
用ob娱乐下载symfony \ component \ httpfoundation \标题;//由一个或多个分隔符分离HTTP标头标题::分裂('da,en-gb; q = 0.8'那',;');// => [['da'],['en-gb','q = 0.8']]//将数组数组组合成一个关联数组标题::结合([[“foo”那“abc”],['酒吧']]);// => ['foo'=>'abc','bar'=> true]//将关联数组连接到字符串中以用于HTTP标头标题::toString.([“foo”=>“abc”那'酒吧'=>真的那'Baz'=>'a b c'],',');// => 'foo=abc, bar, baz="a bc "'//如有必要,将字符串编码为引用的字符串标题::引用('foo“酒吧”);//>'“foo \”bar \“”“//对带引号的字符串进行解码标题::否则('“foo \”bar \“”“);// => 'foo ' bar ' '//解析查询字符串,但维护点(php parse_str()替换'。'按'_')标题::粉刺('foo [bar.baz] = qux');// => ['foo' => ['bar. ']巴兹' = > ' qux ']]
5.2版中的新增功能:这Parsepery()
在Symfony 5.2中引入了方法。ob娱乐下载
访问接受-*
标题数据¶
您可以访问从中提取的基本数据接受-*
通过使用以下方法标题:
-
getAcceptecontentTypes()
- 返回按质量降序排序的可接受内容类型列表。
-
getLanguages ()
- 返回按降序排序的接受语言列表。
-
getCharsets()
- 返回按降序排序的接受的Charsets列表。
-
getEncodings()
- 返回按质量降序排序的已接受编码的列表。
如果您需要获得解析数据的完全访问权限接受
那接受语言
那Accept-Charset
或者接受编码
, 您可以使用ob娱乐下载symfony \ component \ httpfoundation \ acceptheader
效用类:
用ob娱乐下载symfony \ component \ httpfoundation \ acceptheader;acceptHeader美元=AcceptHeader::距离($请求- >标题- >得到('接受'));如果(acceptHeader美元- >有(“text / html”))){美元的项目=acceptHeader美元- >得到(“text / html”);$ charset.=美元的项目- >getAttribute('charset'那'UTF-8');$质量=美元的项目- >get();}//接受标题项按降序按质量排序$ acceptheaders.=AcceptHeader::距离($请求- >标题- >得到('接受')))- >全部();
类中可选包括的默认值接受-*
标题也得到支持:
acceptHeader美元='文本/平原; q = 0.5,text / html,文本/ *; q = 0.8,* / *; q = 0.3';$接受=AcceptHeader::距离(acceptHeader美元);$质量=$接受- >得到('text / xml')- >get();//质量= 0.8$质量=$接受- >得到('application / xml')- >get();// $quality = 0.3
匿名IP地址¶
遵守应用程序遵守用户保护法规的越来越常见的需要是在记录和存储以进行分析目的之前匿名IP地址。使用匿名()
从中的方法ob娱乐下载symfony \ component \ httpfoundation \ iptils
这样做:
用ob娱乐下载symfony \ component \ httpfoundation \ iptils;$ IPv4.='123.234.235.236';$ Anonymousipv4.=iCutils.::匿名($ IPv4.);// $ Anonyousipv4 ='123.234.235.0'$ IPv6.=“2 a01:198:603:10:396e: 4789:8e99:890f”;$ Anonymousipv6.=iCutils.::匿名($ IPv6.);// $ anonymousipv6 ='2a01:198:603:10 ::'
访问其他数据¶
这要求
类有许多其他方法可以用于访问请求信息。看一下这要求API.
有关它们的更多信息。
覆盖请求¶
这要求
不应覆盖类,因为它是表示HTTP消息的数据对象。但是从传统系统中移动时,添加方法或更改一些默认行为可能有所帮助。在这种情况下,注册一个能够创建您的实例的PHP可调用要求
类:
用app \ http \ specialrequest;用ob娱乐下载Symfony \ HttpFoundation \ \组件请求;要求::setFactory(功能(大批$查询=[],大批$请求=[],大批$属性=[],大批$ cookies.=[],大批美元的文件=[],大批$服务器=[],$内容=空值){返回新的SpecialRequest($查询那$请求那$属性那$ cookies.那美元的文件那$服务器那$内容);});$请求=要求::createfromglobals.();
回复¶
一种ob娱乐下载symfony \ component \ httpfoundation \ response
对象将需要从给定请求发送回客户端的所有信息。构造函数最多需要三个参数:HTTP标头的响应内容,状态代码和数组:
用ob娱乐下载symfony \ component \ httpfoundation \ response;$响应=新的回复('内容'那回复::http_ok.那['内容类型'=>“text / html”]);
还可以在响应对象创建后进行操作:
$响应- >setContent.('你好,世界');//标题public属性是一个response headerbag$响应- >标题- >放(“内容类型”那“文本/普通”);$响应- >setStatuscode.(回复::http_not_found.);
设置时内容类型
的响应,您可以设置字符集,但最好通过setcharset()
方法:
$响应- >setcharset.('ISO-8859-1');
请注意,默认情况下,Symfony假定您的响ob娱乐下载应在UTF-8中编码。
发送响应¶
在发送响应之前,您可以选择打电话给准备()
解决与HTTP规范的任何不兼容的方法(例如,错误内容类型
标题):
$响应- >准备($请求);
通过调用该方法,通过调用对客户端的响应发送()
:
$响应- >发送();
设置cookie¶
可以通过响应曲奇进行操纵标题
公共属性:
用ob娱乐下载symfony \ component \ httpfoundation \ cookie;$响应- >标题- >setcookie.(曲奇饼::创造(“foo”那'酒吧'));
这setcookie()
方法需要一个实例ob娱乐下载symfony \ component \ httpfoundation \ cookie
作为一个论点。
你可以通过它清除一个饼干clearcookie()
方法。
除了cookie :: create()
方法,您可以创建一个曲奇饼
来自原始标题值的对象fromstring()
方法。你也可以使用和*()
方法来更改Cookie的某些属性(或使用一个连贯的接口来构建整个Cookie)。每一个和*()
方法使用修改的属性返回一个新对象:
$ cookie.=曲奇饼::创造(“foo”)- >宽容('酒吧')- >withExpires(斯特洛蒂时期('Fri,20-5月20日至2011年15:25:52 GMT')))- >有植物('.example.com')- >withSecure(真的);
5.1版中的新增功能:这和*()
在Symfony 5.1中引入了方法。ob娱乐下载
管理HTTP缓存¶
这ob娱乐下载symfony \ component \ httpfoundation \ response
Class有丰富的方法来操纵与缓存相关的HTTP标头:
setPublic ()
setPrivate ()
(到期)
setExpires ()
setmaxage()
setSharedMaxAge ()
setttl()
setclientttl()
setLastModified ()
seteTag()
setVary ()
笔记
方法setExpires ()
那setLastModified ()
和设置日期()
接受任何实现的对象\ DateTimeInterface
,包括不可变日期对象。
这setCache()
方法可用于在一个方法调用中设置最常用的缓存信息:
$响应- >setCache(['must_revalate'=>错误的那'no_cache'=>错误的那'no_store'=>错误的那“no_transform”=>错误的那'上市'=>真的那'私人的'=>错误的那“proxy_revalidate”=>错误的那'max_age'=>600那“s_maxage”=>600那'不可变'=>真的那“last_modified”=>新的\约会时间(),'Etag'=>'abcdef'那]);
5.1版中的新增功能:这must_revalate
那no_cache.
那no_store.
那no_transform.
和proxy_revalate
指令在Symfony 5.1中介绍。ob娱乐下载
检查响应验证器是否(Etag.
那最后修改
)匹配客户端请求中指定的条件值,使用isNotModified ()
方法:
如果($响应- >isNotModified($请求))){$响应- >发送();}
如果未修改响应,则它将状态代码设置为304并删除实际响应内容。
重定向用户¶
要将客户端重定向到另一个URL,可以使用ob娱乐下载symfony \ component \ httpfoundation \ redirectresponse
类:
用ob娱乐下载symfony \ component \ httpfoundation \ redirectresponse;$响应=新的重新考虑('http://example.com/');
流响应¶
这ob娱乐下载symfony \ component \ httpfoundation \ StreamedResponse
类允许您将响应流返回到客户端。响应内容由PHP可调用而不是字符串表示:
用ob娱乐下载symfony \ component \ httpfoundation \ StreamedResponse;$响应=新的StreamedResponse();$响应- >setCallback(功能(){var_dump.('你好,世界');fl();睡觉(2);var_dump.('你好,世界');fl();});$响应- >发送();
笔记
这flush()
功能不冲洗缓冲。如果ob_start ()
以前被称为output_buffering.
php.ini.
选项已启用,您必须调用ob_flush()
之前flush()
.
此外,PHP不是唯一可以缓冲输出的层。您的Web服务器还可以根据其配置缓冲。某些服务器(如Nginx),让您禁用在配置级别的缓冲或通过在响应中添加特殊的HTTP标头:
//仅禁用NGINX中的FastCGI缓冲,仅对此响应$响应- >标题- >放('X-Accel缓冲'那'不');
服务文件¶
发送文件时,必须添加一个附加项
标题到您的回复。在为基本文件下载创建此标题时,使用非ASCII文件名更加介绍。这makedisposition()
摘要简单API后面的努力工作:
用ob娱乐下载symfony \ component \ httpfoundation \标题;用ob娱乐下载symfony \ component \ httpfoundation \ response;用ob娱乐下载symfony \ component \ httpfoundation \ response headerbag;fileContent美元=...;//生成的文件内容$响应=新的回复(fileContent美元);$性格=标题::makedisposition.(标题::disporsion_actachment.那'foo.pdf');$响应- >标题- >放('内容处理'那$性格);
或者,如果您提供的是静态文件,您可以使用ob娱乐下载symfony \ component \ httpfoundation \ binaryfileresponse
:
用ob娱乐下载symfony \ component \ httpfoundation \ binaryfileresponse;$文件=“路径/ / file.txt”;$响应=新的binaryfileresponse.($文件);
这binaryfileresponse.
将自动处理范围
和IF范围
来自请求的标题。它也支持x-sendfile.
(见nginx.和Apach.)。要利用它,您需要确定是否是x-sendfile-type
标题应该是可信任并致电trustXSendfileTypeHeader ()
如果它应该:
binaryfileresponse.::trustXSendfileTypeHeader();
笔记
这binaryfileresponse.
只会处理x-sendfile.
如果存在特定的标题。对于Apache,这不是默认情况。
属性添加头文件mod_headers.
Apache模块,并将以下内容添加到Apache配置中:
1 2 3 4 5 6 7 8 9 10 |
< IfModulemod_xsendfile.c.>#这已经存在于某处......Xsendfile.上xsendfilepath.......一些路径......#这需要添加:< IfModulemod_headers.c.>要求原告设置x-sendfile-type x-sendfile ifmodule> ifmodule>
|
与之binaryfileresponse.
,你仍然可以设置内容类型
发送的文件,或更改其附加项
:
// ......$响应- >标题- >放(“内容类型”那“文本/普通”);$响应- >setContentDisposition.(ResponseHeaderbag.::disporsion_actachment.那'filename.txt');
控件发送响应后,可以删除该文件deleteFileAfterSend ()
方法。请注意,这将不起作用x-sendfile.
标题已设置。
如果服务文件的大小是未知的(例如,因为它正在飞行时生成,或者因为PHP流过滤器在其上注册等),您可以通过一个溪流
实例到binaryfileresponse.
.这将禁用范围
和内容长度
处理,切换到Chunked Encoding:
用ob娱乐下载symfony \ component \ httpfoundation \ binaryfileresponse;用ob娱乐下载symfony \ component \ httpfoundation \ file \ Stream;$流=新的溪流(的路径/ /流);$响应=新的binaryfileresponse.($流);
笔记
如果你只是在同一请求中创建文件,该文件可能没有任何内容发送。这可能是由于缓存的文件统计数据统计,返回零的文件大小。解决此问题,请致电函数(真的,美元的文件)
与二进制文件的路径。
创建JSON响应¶
任何类型的响应都可以通过ob娱乐下载symfony \ component \ httpfoundation \ response
通过设置正确的内容和标题类。一个JSON响应可能是这样的:
用ob娱乐下载symfony \ component \ httpfoundation \ response;$响应=新的回复();$响应- >setContent.(json_encode.(['数据'=>123.那]));$响应- >标题- >放(“内容类型”那'application / json');
还有一个乐于助人的ob娱乐下载symfony \ component \ httpfoundation \ jsonresponse
班级,可以让这更容易:
用ob娱乐下载symfony \ component \ httpfoundation \ jsonresponse;//如果您知道创建响应时要发送的数据$响应=新的jsonresponse.(['数据'=>123.]);//如果您不知道要发送的数据或要自定义编码选项$响应=新的jsonresponse.();// ......//配置任何自定义编码选项(如果需要,必须在“setData()”之前调用它// $ response-> setencodingOptions(jsonresponse :: default_encoding_options | \ json_preeserve_zero_fraction);$响应- >setdata.(['数据'=>123.]);//如果要发送的数据已在JSON中编码$响应=jsonresponse.::fromJsonString('{“数据”:123}');
这jsonresponse.
班级设置了内容类型
标题为应用/ JSON.
并在需要时将数据编码为JSON。
jsonp回调¶
如果您使用的是JSONP,可以设置数据应该传递给以下内容的回调函数:
$响应- >setCallback(“handleResponse”);
在这种情况下,内容类型
标题将是text / javascript.
响应内容将如下所示:
1 |
Handleresponse.({'数据':123.});
|
安全内容的偏好¶
某些网站具有“安全”模式,可以帮助那些不想暴露于他们可能对象的内容的人。这RFC 8674规范定义了用户代理向服务器请求安全内容的方法。
该规范没有定义内容可能被视为令人反感的内容,因此不确定“安全”的概念。相反,该术语由服务器解释,并在每个网站的范围内选择用于在此信息采取行动的范围内。
ob娱乐下载Symfony提供了两种与此偏好进行交互:
5.1版中的新增功能:这prefersafecontent()
和setContentSafe ()
在Symfony 5.1中引入了方法。ob娱乐下载
以下示例显示了如何检测用户代理是否更喜欢“安全”内容:
如果($请求- >prefersafontent.()){$响应=新的回复(alternativeContent美元);//这通知用户我们尊重他们的偏好$响应- >setContentsafe.();返回$响应;}
这项工作,包括代码样本,是在一个Creative Commons by-SA 3.0执照。