HttpFoundation组件

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.3,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

HttpFoundation组件

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

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

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

安装

你可以用两种不同的方式安装组件:

然后,要求供应商/ autoload.php文件以启用Composer提供的自动加载机制。否则,您的应用程序将无法找到这个Symfony组件的类。ob娱乐下载

请求

创建请求的最常用方法是基于当前的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实例有方法来检索和更新它们的数据:

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

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

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

所有getter参数最多包含三个参数:第一个是参数名,第二个是参数不存在时返回的默认值:

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

当PHP导入请求查询时,它处理如下请求参数foo(酒吧)=酒吧以一种特殊的方式创建数组。所以你可以得到喷火参数,你会得到一个数组酒吧元素。但有时,你可能想获取“原始”参数名的值:foo(酒吧).这是可能的ParameterBaggetter像get ()通过第三个论证:

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

感谢公众属性属性的实例,则可以在请求中存储其他数据,该请求也是ParameterBag.这主要用于附加属于请求的信息,并且需要从应用程序中的许多不同点访问这些信息。有关如何在Symfony框架中使用它的信息,请参见ob娱乐下载Symfob娱乐下载ony的书

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

1
内容请求->getContent ();

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

识别请求

在您的应用程序中,您需要一种方法来识别请求;大多数情况下,这是通过请求的“路径信息”来完成的,可以通过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 ()方法;的hasPreviousSession ()方法告诉您请求是否包含在以前的一个请求中启动的会话。

访问' Accept-* '头数据

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

getAcceptableContentTypes ()
返回按质量降序排序的可接受内容类型列表。
getLanguages ()
返回按质量降序排序的可接受语言列表。
getCharsets ()
返回按质量降序排序的可接受字符集列表。
..versionadded:: 2.2
AcceptHeader类在Symfony 2.2中引入。ob娱乐下载

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

12 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载组件HttpFoundationAcceptHeader接受= AcceptHeader::fromString (请求->->get (“接受”));如果接受->有(“text / html”)) {接受->get (“text / html”);字符集->getAttribute (“字符集”“utf - 8”);质量->getQuality ();}//接收头项按降序排序接受= AcceptHeader::fromString (请求->->get (“接受”))->所有();

访问其他数据

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

响应

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

1 2 3 4 5 6 7
使用ob娱乐下载组件HttpFoundation响应响应响应(“内容”200数组“内容类型”= >“text / html”));

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

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

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

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

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

发送响应

在发送响应之前,可以通过调用准备()方法:

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

向客户端发送响应就像调用一样简单send ()

1
响应->send ();

设置cookie

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

1 2 3
使用ob娱乐下载组件HttpFoundation饼干响应->->setCookie (饼干(“foo”“酒吧”));

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

您可以通过clearCookie ()方法。

管理HTTP缓存

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

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

1 2 3 4 5 6 7 8
响应->setCache (数组“etag”= >“六边形abcdef”“last_modified”= >\ DateTime (),“max_age”= >600“s_maxage”= >600“私人”= >“公共”= >真正的));

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

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

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

重定向用户

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

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

流媒体响应

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

1 2 3 4 5 6 7 8 9 10 11
使用ob娱乐下载组件HttpFoundationStreamedResponse响应StreamedResponse ();响应->setCallback (函数(){var_dump (“Hello World”);冲洗();睡眠(2);var_dump (“Hello World”);冲洗();});响应->send ();

请注意

冲洗()函数不刷新缓冲。如果ob_start ()之前被调用过还是output_bufferingphp . ini选项已启用,您必须调用ob_flush ()之前冲洗()

此外,PHP并不是唯一可以缓冲输出的层。您的web服务器也可能根据其配置进行缓冲。更重要的是,如果你使用FastCGI,缓冲根本不能被禁用。

服务文件

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

1 2 3 4 5 6 7 8
使用ob娱乐下载组件HttpFoundationResponseHeaderBagd响应->->makeDisposition (ResponseHeaderBag::DISPOSITION_ATTACHMENT,“foo.pdf”);响应->->集(“附加”d);

2.2

BinaryFileResponse类在Symfony 2.2中引入。ob娱乐下载

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

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

BinaryFileResponse会自动处理范围而且If-Range来自请求的头文件。它还支持X-Sendfile(见Nginx而且Apache).要使用它,您需要确定是否X-Sendfile-Type头应受信任并调用trustXSendfileTypeHeader ()如果应该:

1
BinaryFileResponse::trustXSendfileTypeHeader ();

BinaryFileResponse,您仍然可以设置内容类型,或更改其附加项

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

2.6

deleteFileAfterSend ()方法在Symfony 2.6中引入。ob娱乐下载

方法发送请求后,可以删除该文件deleteFileAfterSend ()方法。请注意,当X-Sendfile设置报头。

请注意

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

创建JSON响应

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

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

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

1 2 3 4 5 6
使用ob娱乐下载组件HttpFoundationJsonResponse响应JsonResponse ();响应->setData (数组“数据”= >123));

这将把数据数组编码为JSON并设置内容类型头来application / json

谨慎

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

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

JSONP回调

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

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

在这种情况下,内容类型Header将为text / javascript响应内容看起来像这样:

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

会话

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

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。