blacktrs / data-transformer
无依赖的 PHP 数组到对象的转换器
v1.1.2
2023-09-17 13:27 UTC
Requires
- php: >=8.2
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.26
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10
- symfony/var-dumper: ^6.3
- vimeo/psalm: ^5.15
README
数据转换器
现代 PHP 库,用于将数组转换为对象,反之亦然。
安装
composer require blacktrs/data-transformer
摘要
默认情况下,库将尝试解析 public
属性并与数组字段匹配。转换器试图找到与数组字段名称相同的对象属性。如果对象缺少此类字段,转换器将数组键转换为驼峰式。但是,可以通过属性配置所需属性。
功能
- 无缝地将对象转换为数组,反之亦然
- 自动将嵌套的具有类类型提示的属性转换为数组,反之亦然
- 库尊重声明的属性类型
- 除非显式地将属性声明为可由属性写入,否则库将尊重私有属性
- 库考虑与属性名称相同的获取器或方法
- 枚举转换
- 可序列化对象的转换
- 可配置的自定义属性值解析器
- 可配置的自定义对象转换器
配置
默认转换器实现 \Blacktrs\DataTransformer\Transformer\Transformer
允许使用方法 setIncludePrivateProperties
或构造函数参数 $includePrivateProperties
强制写入私有属性
属性 DataField
此属性适用于属性。通过此属性,您可以配置所需属性的行为
可以指定以下参数
string|null $nameIn
输入数组中与属性映射的字段名称string|null $nameOut
填充属性数据的输出数组中的字段名称ValueResolverInterface|class-string<ValueResolverInterface>|null $valueResolver
自定义值解析器以按所需方式转换属性数据array<key,value> $valueResolverArguments
传递给值解析器的附加参数TransformerInterface|class-string<TransformerInterface>|null $objectTransformer
自定义属性转换器以在传递对象时获得更多控制bool $ignoreTransform
在将数组转换为对象时跳过属性bool $ignoreSerialize
在将对象序列化为数组时跳过属性
属性 DataObject
此属性适用于类,允许在将对象转换为其他形式时使用自定义对象序列化器
可以指定以下参数
ObjectSerializerInterface|class-string<ObjectSerializerInterface>|null $objectTransformer
自定义对象序列化器
示例
将数组转换为对象
use Blacktrs\DataTransformer\Attribute\DataField; use Blacktrs\DataTransformer\Value\DateTimeValueResolver; use Blacktrs\DataTransformer\Transformer\Transformer; class RequestObject { public readonly int $id; public readonly string $email; public readonly string $name; #[DataField(valueResolver: DateTimeValueResolver::class)] public readonly \DateTime $date; } $requestPayload = ['id' => 1, 'email' => 'some.email@example.com', 'name' => 'John Doe', 'date' => '2023-06-01 10:10:10']; $transformer = new Transformer(); $requestObject = $transformer->transform(RequestObject::class, $requestPayload); echo $requestObject->id; // 1 echo $requestObject->email; // some.email@example.com echo $requestObject->name; // John Doe echo $requestObject->date->format('Y-m-d'); // 2023-06-01
将对象转换为数组
use Blacktrs\DataTransformer\Serializer\ObjectSerializer; class ResponseObject { public function __construct( public readonly int $id, public readonly string $email, public readonly string $name ) { } } $responseObject = new ResponseObject( id: 1, email: 'some.email@example.com', name: 'John Doe' ); $serializer = new ObjectSerializer(); $responseArray = $serializer->serialize($responseObject); echo $responseArray['id']; // 1
更多示例
更多示例可以在 tests
中找到