azjezz / input-hydrator
Hydrates input DTOs from request input.
Requires
- php: >=7.4
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.16
- infection/infection: ^0.19.2
- php-coveralls/php-coveralls: ^2.4
- phpunit/phpunit: ^9.4
- roave/security-advisories: dev-master
- squizlabs/php_codesniffer: ^3.5
- vimeo/psalm: ^4.1
This package is auto-updated.
Last update: 2024-10-29 06:00:11 UTC
README
Input hydrator is a simple hydrator made for the sole purpose of hydrating data-transfer input objects.
Installation
$ composer require azjezz/input-hydrator
Example:
use AzJezz\Input; final class Search implements Input\InputInterface { public string $query; } /** * @var Search $search */ $search = (new Input\Hydrator())->hydrate(Search::class, $_GET); print $search->query;
While hydrating objects, some exceptions might be thrown:
-
AzJezz\Input\Exception\TypeException
: this exception should result in 500 HTTP status code, as it represents an issue within the input class itself. such as the usage of a non-supported type, or missing type for a specific property. -
AzJezz\Input\Exception\BadInputException
: this exception should result in a 400 HTTP status code, as it means that the supplied request data doesn't match the input DTO structure.
Currently, Input-Hydrator is limited to a small set of types:
scalar
(string
,int
,float
, andbool
)null
- any object that implements
AzJezz\Input\InputInterface
Union types are supported for PHP >= 8.0, for example:
use AzJezz\Input; final class Filter implements Input\InputInterface { public ?int $maximumPrice; public ?int $minimumPrice; } final class Search implements Input\InputInterface { public string $query; public null|Filter|string $filter = null; } /** * $filter is optional, and is missing from the request, therefore it's gonna contain the default value. * * @var Search $search */ $search = (new Input\Hydrator())->hydrate(Search::class, [ 'query' => 'hello' ]); /** * $search->filter is now an instance of `Filter` * * @var Search $search */ $search = (new Input\Hydrator())->hydrate(Search::class, [ 'query' => 'hello', 'filter' => [ 'maximum_price' => 1000, 'minimum_price' => 10, // the field is optional ( nullable ), so we can remove this line. ] ]); /** * $search->filter is now a string * * @var Search $search */ $search = (new Input\Hydrator())->hydrate(Search::class, [ 'query' => 'hello', // this is okay as the `null|Filter|string` union contains `string` 'filter' => 'maximum_price=1000&minimum_price=10', ]); print $search->query;
License
The MIT License (MIT). Please see LICENSE
for more information.