nutgram /
PHP 8.0+ 的 Hydrator
6.0.1
2024-07-16 09:41 UTC
Requires
- php: ^8.1
- psr/container: ^1.1 || ^2.0
Requires (Dev)
- illuminate/container: ^10.0
- phpunit/phpunit: ~9.5.0
README
原始项目的分支 https://github.com/sunrise-php/hydrator.
安装
composer require nutgram/hydrator
如何使用?
use SergiX44\Hydrator\Hydrator; $hydrator = new Hydrator(); // create and hydrate an object with an array $data = [/* the class props here */]; $object = $hydrator->hydrate(SomeDto::class, $data); // hydrate an object with an array $data = [/* the class props here */]; $hydrator->hydrate($object, $data); // creates and hydrate an object with JSON $json = '{...}'; $object = $hydrator->hydrateWithJson(SomeDto::class, $json); // hydrate an object with JSON $json = '{...}'; $hydrator->hydrateWithJson($object, $json); // pass JSON decoding flags $options = JSON_OBJECT_AS_ARRAY|JSON_BIGINT_AS_STRING; $hydrator->hydrateWithJson($object, $json, $options);
允许的属性类型
必需的
如果一个属性没有默认值,则该属性是必需的。
public string $value;
可选的
如果一个属性有默认值,则该属性是可选的。
public string $value = 'foo';
空值
如果一个属性是可空的,则该属性可以接受 null。
public ?string $value;
如果一个属性应该是可选的,则它必须有一个默认值。
public ?string $value = null;
布尔值
接受以下值:true, false, 1, 0, "1", "0", "yes", "no", "on" 和 "no"。
public bool $value;
['value' => true]; ['value' => 'yes'];
整数
仅接受整数(也可作为字符串)。
public int $value;
['value' => 42]; ['value' => '42'];
Number<int|float>
仅接受数字(也可作为字符串)。
public float $value;
['value' => 42.0]; ['value' => '42.0'];
字符串
仅接受字符串。
public string $value;
['value' => 'foo'];
Array<array-key, mixed>
仅接受数组。
public array $value;
['value' => [1, 2, 'foo']];
Array<array-key, class>
接受对象列表。
final class SomeDto { public readonly string $value; }
use SergiX44\Hydrator\Annotation\ArrayType; #[ArrayType(SomeDto::class)] public array $value;
[ 'value' => [ [ 'value' => 'foo', ], [ 'value' => 'bar', ], ], ],
对象
仅接受对象。
public object $value;
['value' => new stdClass];
DateTime/DateTimeImmutable
整数(也可作为字符串)将被处理为时间戳,否则仅接受有效的日期时间字符串。
public DateTimeImmutable $value;
// 2010-01-01 ['value' => 1262304000]; // 2010-01-01 ['value' => '1262304000']; // normal date ['value' => '2010-01-01'];
DateInterval
仅接受基于 ISO 8601 的有效日期区间字符串。
public DateInterval $value;
['value' => 'P1Y']
枚举
仅接受存在于枚举中的值。
enum SomeEnum: int { case foo = 0; case bar = 1; }
public SomeEnum $value;
['value' => 0] ['value' => '1']
关联
接受关联的有效结构
final class SomeDto { public string $value; }
public SomeDto $value;
[ 'value' => [ 'value' => 'foo', ], ]
属性别名
如果您需要获取非规范化键,请使用别名。
例如,Google Recaptcha API 返回以下响应
{ "success": false, "error-codes": [] }
为了正确映射响应,请使用以下模型
use SergiX44\Hydrator\Annotation\Alias; final class RecaptchaVerificationResult { public bool $success; #[Alias('error-codes')] public array $errorCodes = []; }
示例
final class Product { public string $name; public Category $category; #[ArrayType(Tag::class)] public array $tags; public Status $status; } final class Category { public string $name; } final class Tag { public string $name; } enum Status: int { case ENABLED = 1; case DISABLED = 0; }
$product = $hydrator->hydrate(Product::class, [ 'name' => 'Stool', 'category' => [ 'name' => 'Furniture', ], 'tags' => [ [ 'name' => 'Wood', ], [ 'name' => 'Lacquered', ], ], 'status' => 0, ]);
测试运行
composer test