HttpFoundation组件
编辑该页面HttpFoundation组件
深入框架创建过程之前,让我们先退一步,让我们看一看为什么你想使用一个框架,而不是让你知道老式的PHP应用程序。为什么使用一个框架实际上是一个好主意,即使是最简单的代码片段,为什么创建您在Symfony框架组件比从头创建一个框架。ob娱乐下载
请注意
我们不会谈论传统工作时使用一个框架的好处与几大应用程序开发人员;网上已经有很多好的资源主题。
即使我们在前一章中写道“应用程序”是很简单,它也存在一些问题:
1 2 3 4
/ /框架/ index . php美元的名字=美元_GET(“名字”];printf (“你好% s”,美元的名字);
首先,如果的名字
查询参数的URL查询字符串中没有定义,你会得到一个PHP警告;让我们改正:
1 2 3 4
/ /框架/ index . php美元的名字=美元_GET(“名字”)? ?“世界”;printf (“你好% s”,美元的名字);
然后,这应用程序是不安全的。你能相信吗?甚至这个简单的PHP代码片段很容易受到最广泛的网络安全问题,XSS(跨站点脚本)。这是一个更安全的版本:
1 2 3 4 5
美元的名字=美元_GET(“名字”)? ?“世界”;头(内容类型:text / html;charset = utf - 8 ');printf (“你好% s”,:美元的名字ENT_QUOTES,“utf - 8”));
请注意
正如您可能已经注意到,确保您的代码htmlspecialchars函数
是单调乏味,而且容易出错。这是使用模板引擎的原因之一嫩枝,auto-escaping在缺省情况下是启用的,可能是一个好主意(显式的逃避也不那么痛苦与一个简单的使用e
过滤器)。
正如你所看到的,我们写了简单的代码首先是不再那么简单了,如果我们想避免PHP警告/注意到和使代码更安全。
除了安全之外,这段代码可以复杂的测试。即使没有多少测试,它震撼了我,编写单元测试最简单的PHP代码片段不自然,觉得丑。这是一个初步PHPUnit)上面的代码单元测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ /框架/ test.php使用PHPUnit)\框架\TestCase;类IndexTest扩展TestCase{公共函数testHello():无效{美元_GET(“名字”]=“法”;ob_start ();包括“index . php”;美元内容= ob_get_clean ();美元这- >assertequal (“你好法”,美元内容);}}
请注意
如果我们的应用程序只是略大,我们将能够找到更多的问题。如果你是好奇,阅读ob娱乐下载Symfony PHP与平这本书的一章。
在这一点上,如果你不相信,安全性和测试确实是两个很好的理由不写代码旧方式,转而采用框架(无论采用框架意味着在这种情况下),你现在可以停止阅读这本书,回到任何代码之前正在。
请注意
使用一个框架应该给你的不仅仅是安全性和可测试性,但更重要的是要记住,你选择的框架必须允许您编写更好的代码更快。
OOP HttpFoundation组件
编写网页代码与HTTP交互。所以,我们的框架的基本原则应该在HTTP规范。
HTTP规范描述了一个客户端(例如浏览器)与服务器进行交互(通过web服务器应用程序)。客户端和服务器之间的对话框是由明确的规定消息请求和响应:客户端发送一个请求到服务器,并基于此请求,服务器返回一个响应。
在PHP中,请求用全局变量($ _GET
,$ _POST
,带有_FILE美元
,_COOKIE美元
,_SESSION美元
…)和生成的响应函数(回声
,头
,setcookie
,……)。
第一步可能是更好的代码使用面向对象的方法;的主要目标的Symfony HttpFoundationob娱乐下载组件:替换默认的PHP全局变量和函数通过面向对象层。
使用这个组件,添加它的依赖项目:
1
美元作曲家需要symfony / htob娱乐下载tp-foundation
运行这个命令也会自动下载Symfony HttpFoundation组件和安装它ob娱乐下载供应商/
目录中。一个composer.json
和一个composer.lock
将生成的文件,包含了新的需求。
现在,让我们重写应用程序使用请求
和响应
类:
1 2 3 4 5 6 7 8 9 10 11 12 13
/ /框架/ index . phprequire_once__DIR__。“/供应商/ autoload.php”;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;美元请求=请求::createFromGlobals ();美元的名字=美元请求- >查询- >get (“名字”,“世界”);美元响应=新响应(sprintf (“你好% s”,:美元的名字ENT_QUOTES,“utf - 8”)));美元响应- >send ();
的createFromGlobals ()
方法创建一个请求
基于当前的PHP对象全局变量。
的send ()
方法发送响应
对象返回到客户机(HTTP头后面跟着它首先输出内容)。
提示
之前send ()
电话,我们应该添加一个调用准备()
方法((响应- >准备美元请求);
),以确保我们的反应是符合HTTP规范。例如,如果我们要调用的页面头
方法,它将消除响应的内容。
前面的代码的主要区别在于,你有完全控制的HTTP消息。你可以创造任何你想要的要求,负责发送响应每当你认为合适的。
请注意
我们还没有显式地设置内容类型
头在重写代码响应对象默认的字符集utf - 8
。
与请求
类,你有所有请求的信息在你的指尖由于一个不错的和简单的API:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/ /被请求的URI(例如/关于)-任何查询参数美元请求- >getPathInfo ();/ /检索GET和POST变量分别美元请求- >查询- >get (“foo”);美元请求- >请求- >get (“酒吧”,“如果酒吧不存在默认值”);/ /获取服务器变量美元请求- >服务器- >get (“HTTP_HOST”);/ /检索UploadedFile被foo的实例美元请求- >文件- >get (“foo”);/ /获取一个COOKIE的值美元请求- >饼干- >get (“PHPSESSID”);/ /检索HTTP请求头,规范化,小写字母键美元请求- >头- >get (“主机”);美元请求- >头- >get (“内容类型”);美元请求- >getMethod ();/ / GET、POST、PUT、DELETE,头美元请求- >getLanguages ();/ /客户端接受语言的数组
你也可以模拟一个请求:
1
美元请求=请求::创建(“/ index . php ? name =法”);
与响应
类,你可以调整反应:
1 2 3 4 5 6 7 8
美元响应=新反应();美元响应- >setContent (“Hello world !”);美元响应- >setStatusCode (200年);美元响应- >头- >集(“内容类型”,“text / html”);/ /配置HTTP缓存头美元响应- >setMaxAge (10);
提示
调试一个响应,丢给一个字符串;它将返回HTTP响应(标题和内容)的代表。
最后但并非最不重要的是,这些类,像所有其他类在Symfony代码,ob娱乐下载经审计的安全问题由一个独立的公司。作为一个开源项目也意味着许多世界各地的其他开发人员阅读代码和已经固定的潜在的安全问题。你上次是什么时候要求自制的专业安全审计框架?
甚至一些简单客户端IP地址可以不安全:
1 2 3
如果(美元myIp= = =美元_SERVER(“REMOTE_ADDR”){/ /客户端是一个已知的一个,所以给它更多的特权}
效果非常好,直到你添加一个反向代理的生产服务器;在这一点上,你将不得不改变你的代码让它工作在您的开发机(你没有代理)和您的服务器:
1 2 3
如果(美元myIp= = =美元_SERVER(“HTTP_X_FORWARDED_FOR”)| |美元myIp= = =美元_SERVER(“REMOTE_ADDR”){/ /客户端是一个已知的一个,所以给它更多的特权}
使用要求::getClientIp ()
方法从一开始就会给你正确的行为(它会覆盖的情况你有链接代理):
1 2 3 4 5
美元请求=请求::createFromGlobals ();如果(美元myIp= = =美元请求- >getClientIp ()) {/ /客户端是一个已知的一个,所以给它更多的特权}
还有一个额外的好处:它是安全默认情况下。这是什么意思?的$ _SERVER (“HTTP_X_FORWARDED_FOR”)
价值不能信任,因为它可以被最终用户在没有代理。因此,如果您正在使用这段代码在生产中没有一个代理,它变得非常容易滥用您的系统。那不是的getClientIp ()
方法,您必须显式地相信你的反向代理通过调用setTrustedProxies ()
:
1 2 3 4 5
请求::setTrustedProxies ([“10.0.0.1”表示]);如果(美元myIp= = =美元请求- >getClientIp ()) {/ /客户端是一个已知的一个,所以给它更多的特权}
所以,getClientIp ()
在所有情况下安全地方法。你可以用它在你所有的项目,无论配置,它将正确安全的行为。这是使用一个框架的目标之一。如果你是从头开始编写一个框架,你必须考虑所有这些情况下自己。为什么不使用一种技术,已经工作了吗?
请注意
如果你想了解更多关于HttpFoundation组件,你可以看一下ob娱乐下载Symfony \ \ HttpFoundation组件
其专用API或阅读欧宝官网下载app。
信不信由你,但我们有我们的第一个框架。你可以停止现在,如果你想要的。仅使用Symfony Httpob娱乐下载Foundation组件已经允许您编写更好、更可测试的代码。它还允许您编写代码更快的尽可能多的日常问题已经解决。
事实上,Drupal项目采用HttpFoundation组件;如果成功的话,它可能会为你工作。不要重新发明轮子。
我几乎忘记了谈论一个额外的好处:使用HttpFoundation组件是更好的开始之间的互操作性框架和使用它的应用程序(如ob娱乐下载,Drupal 8,phpBB 3,Laravel和ezPublish 5,更多的)。