sbsedv / input-converter
一个最小的PHP库,以原生方式支持以multipart/form-data、application/x-www-form-urlencoded和多种JSON类型(如application/json)的形式提交的PUT、PATCH和DELETE用户输入,包括具有复杂数据结构(嵌套HTML表单)的情况。
Requires
- php: >=8.1
- riverline/multipart-parser: ^2.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.13
- nyholm/psr7: ^1.4
- phpstan/phpstan: ^1.8
- phpunit/phpunit: ^9.5
- symfony/http-foundation: ^6.0
Suggests
- nyholm/psr7: A super lightweight PSR-7 implementation. Very strict and very fast.
- symfony/http-foundation: The Symfony HttpFoundation component replaces these default PHP global variables and functions by an object-oriented layer.
README
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_decode 和 parse_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-7 或 HTTP-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 );