sbsedv/input-converter

此包已被废弃,不再维护。未建议替代包。

一个最小的PHP库,以原生方式支持以multipart/form-data、application/x-www-form-urlencoded和多种JSON类型(如application/json)的形式提交的PUT、PATCH和DELETE用户输入,包括具有复杂数据结构(嵌套HTML表单)的情况。

v3.0.0 2023-04-17 21:53 UTC

This package is auto-updated.

Last update: 2023-12-24 19:31:30 UTC


README

PHPUnit PHPStan PHPCS-Fixer

sbsedv/input-converter

一个最小的PHP组件,以原生方式支持在POST方法之外的HTTP方法上解析用户输入。

PHP原生仅支持在POST HTTP请求上解析multipart/form-data和application/x-www-form-urlencoded。

许多现代Web应用程序也希望使用/支持以下内容:a) 其他HTTP方法,如PUT或PATCH;b) 其他内容编码,如JSON或XML。

此组件提供了一个非常简单且可扩展的面向对象API,以支持上述功能。

内部,此组件使用PHP原生函数 json_decodeparse_str(multipart/form-data转换为x-www-form-urlencoded)进行解析,因此复杂的数据结构(数组和对象)仅限于这些函数所支持的范围。
这意味着以下HTML表单将得到 完全支持

<form method="PUT">
    <select name="select[]" multiple>
        ...
    </select>

    <input type="text" name="text" />

    <input type="text" name="obj[key1]" />
    <input type="text" name="obj[key2]" />
    <select name="obj[key3][]" multiple>
        ...
    </select>
</form>

工作原理

您应该在应用程序生命周期尽可能早地实例化和调用此组件。

您必须将 PSR-7HTTP-Foundation 请求包装器对象传递给“convert”方法。

<?php declare(strict_types=1);

use SBSEDV\InputConverter\InputConverter;
use SBSEDV\InputConverter\Request\HttpFoundationRequest;
use SBSEDV\InputConverter\Request\Psr7Request;

$request = new HttpFoundationRequest($request);
// $request = new Psr7Request($request);

try {
    (new InputConverter())
        ->addConverter(...) // your converters
        ->convert($request);
} catch (MalformedContentException $e) {
    // a converter supported the request
    // but encountered an error while parsing

    http_status_code(400);
    exit();
} catch (UnsupportedRequestException) {
    // no converter supported the request
}

解析后的主体数据将自动添加到底层Psr7或Http-Foundation请求对象中。

注意:Psr7请求是不可变的。您可以通过调用 $request->getRequest() 获取新对象。

转换器

实际的解析由实现 SBSEDV\InputConverter\Converter\ConverterInterface 的转换器类处理。

您始终可以自己实现转换器。

默认情况下,我们支持三个可定制的转换器

SBSEDV\InputConverter\Converter\UrlEncodedConverter

通过其构造函数,您可以影响它支持哪些HTTP方法。

public function __construct(
    array $methods = ['PUT', 'PATCH', 'DELETE']
);

SBSEDV\InputConverter\Converter\JsonConverter

通过其构造函数,您可以影响它支持哪些内容类型和HTTP方法。

public function __construct(
    array $contentTypes = ['application/json'],
    array $methods = ['POST', 'PUT', 'PATCH', 'DELETE']
);

SBSEDV\InputConverter\Converter\FormDataConverter

通过其构造函数,您可以影响它支持哪些内容类型和HTTP方法。

内部,它使用 riverline/multipart-parser 库进行解析。

public function __construct(
    array $methods = ['PUT', 'PATCH', 'DELETE'],
    bool $fileSupport = false
);