blacktrs/data-transformer

无依赖的 PHP 数组到对象的转换器

v1.1.2 2023-09-17 13:27 UTC

This package is auto-updated.

Last update: 2024-09-30 01:38:13 UTC


README

Scrutinizer 覆盖率  GitHub 工作流程状态  Packagist 版本

数据转换器

现代 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 中找到