fracture / http
HTTP抽象库,是fracture/router的提取依赖。
Requires
- php: >=5.5.0
Requires (Dev)
- satooshi/php-coveralls: 0.7.*@dev
- sebastianbergmann/phpcov: 1.1.0
README
简介
这是一个简单的处理HTTP请求和响应的抽象。库是用于与fracture\routing交互,并提供简单的面向对象接口。
安装
您可以使用以下命令使用composer将库添加到项目中
composer require fracture/http
##用法
以下所有代码都假设已经包含了Composer的自动加载器。
###基本请求初始化
虽然可以手动初始化新的Request
实例,但要完全准备该实例,需要几个额外的步骤。为了简化这个过程,您应该使用RequestBuider
,它将执行所有这些步骤
<?php // -- unimportant code above -- $builder = new Fracture\Http\RequestBuilder; $request = $builder->create([ 'get' => $_GET, 'files' => $_FILES, 'server' => $_SERVER, 'post' => $_POST, 'cookies'=> $_COOKIE, ]);
使用此代码片段对于任何基本网站都足够了,并且会产生一个可用的Request
实例。
###请求和REST
当创建一个提供REST API的网站时,通常的做法是通过HTTP Accept和Content-Type头部实现API版本控制。但是,如果您发送一个带有自定义Content-Type头部的POST
查询,PHP将不会将您发送到服务器的信息填充到$_POST
中。PHP中也没有$_PUT
和$_DELETE
超级全局变量。
为了以可用的形式检索数据信息,您需要定义一个内容解析器,如果媒体类型匹配,则执行该解析器以向Request
实例补充额外的参数。
<?php // -- unimportant code above -- $builder = new Http\RequestBuilder; $builder->addContentParser('application/json', function () { $data = json_decode(file_get_contents('php://input'), true); if ($data === null) { $data = []; } return $data; }); $request = $builder->create([ 'server' => $_SERVER, 'cookies'=> $_COOKIE, ]);
RequestBuilder
实例可以添加多个内容解析器。
####内容解析器
内容解析器被定义为匿名函数,它将使用Fracture\Http\Headers\ContentType
和Fracture\Http\Request
实例作为参数执行,并期望返回一个包含name => value
对的参数数组。
array function([ Fracture\Http\Headers\ContentType $header [, Fracture\Http\Request $request]])
您还可以使用内容解析器来覆盖Request
属性。例如,如果您想更改请求方法,当使用类似于<input type="hidden" name="_my_method" value="PUT" />
(这是一种更RESTful和绕过标准网页限制的常见方法)提交表单时
<?php // -- unimportant code above -- $builder->addContentParser('*/*', function ($header, $request) { $override = $request->getParameter('_my_method'); if ($override) { $request->setMethod($override); } return []; });
###访问请求中的数据
当Request
实例完全初始化(最好使用RequestBuilder
)时,您可以从此抽象中提取几种类型的信息。
####参数
要从初始化的Request
实例检索参数,您必须使用getParameter()
方法
<?php // -- unimportant code above -- $id = $request->getParameter('id');
当实例使用RequestBuilder
生成时,它将包含来自$_GET
、$_POST
和内容解析器中的数据。
重要!
如果您的代码中包含两个在$_GET
和$_POST
中具有相同名称的参数,将触发警告。如果其中一个内容解析器返回已在$_GET
或$_POST
中存在的参数,也将触发相同的警告。该库的设计假设这种重叠是一个无意中的错误。
getParameter()
方法具有以下签名
mixed Request::getParameter( string $name );
如果提供的名称不存在参数,则该方法将返回null
。
####Cookies
通过使用getCookies()
方法检索cookies。
<?php // -- unimportant code above -- $token = $request->getCookie('token');
getCookie()
方法具有以下签名
mixed Request::getCookie( string $name );
如果提供的名称不存在参数,则该方法将返回null
。
####文件上传
从Request
实例检索上传文件的方
<?php // -- unimportant code above -- $file = $request->getUpload('attachment');
该方法使用输入名称作为参数调用。根据您上传表单的结构,它将返回一个UploadedFile
实例,如果您的HTML中包含name="attachment"
,或者返回一个FileBag
实例,如果表单元素包含name="attachment[]"
。
如果未使用给定字段名称上传文件,则该方法将返回null
。
方法签名如下
mixed Request::getUpload( string $name );
####请求方法
要检索HTTP请求方法,您必须使用getMethod()
方法。
<?php // -- unimportant code above -- $method = $request->getMethod();
它具有以下签名
string Request::getMethod( void );
####头部信息
目前,Request
实例允许您通过使用getAcceptHeader()
和getContentTypeHeader()
方法访问Accept和Content-Type HTTP头部的抽象。可以通过以下方法完成
Fracture\Http\Headers\Accept Request::getAcceptHeader( void )
和
Fracture\Http\Headers\ContentType Request::getContentTypeHeader( void )