Input hydrator is a simple hydrator made for the sole purpose of hydrating data-transfer input objects.
$ composer require azjezz/input-hydrator
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;
The MIT License (MIT). Please see LICENSE
for more information.