fracture/http

HTTP抽象库,是fracture/router的提取依赖。

0.4.2 2016-03-10 22:04 UTC

This package is auto-updated.

Last update: 2024-09-16 02:33:42 UTC


README

Build Status Code Coverage Scrutinizer Packagist

简介

这是一个简单的处理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\ContentTypeFracture\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 )