antwerpes/data-transfer-object

PHP数据对象的简单JSON编码和解码

1.0.3 2024-09-12 11:31 UTC

This package is auto-updated.

Last update: 2024-09-12 11:31:40 UTC


README

Latest Version on Packagist GitHub Code Style Action Status Total Downloads

一个简单的库,用于将JSON结构编码和解码为PHP对象,例如以强类型方式处理API响应。

安装

您可以通过composer安装此包

composer require antwerpes/data-transfer-object

用法

定义一个扩展Antwerpes\DataTransferObject\DataTransferObject的类,并定义对象的结构

use Antwerpes\DataTransferObject\Attributes\Cast;
use Antwerpes\DataTransferObject\Attributes\Map;
use Antwerpes\DataTransferObject\Casts\ArrayCaster;
use Antwerpes\DataTransferObject\DataTransferObject;

class User extends DataTransferObject
{
    public function __construct(
        public string $name;
        #[Cast(CustomDateCaster::class)]
        public DateTimeInterface $birthday;
        #[Map(from: 'address.city')]
        public string $city;
        #[Cast(ArrayCaster::class, itemType: Interest:class)]
        public array $interests;
    ) {}
}

然后您可以使用该类将JSON字符串解码为PHP对象

$json = '{
    "name": "John Doe",
    "birthday": "1990-01-01",
    "address": {
        "city": "New York"
    },
    "interests": [
        {
            "name": "Music"
        },
        {
            "name": "Programming"
        }
    ]
}';
$user = User::decode(json_decode($json, true));
$encoded = $user->encode();

自定义转换器

您可以通过实现Antwerpes\DataTransferObject\CastsProperty接口来定义自定义转换器

use Antwerpes\DataTransferObject\CastsProperty;

class CustomDateCaster implements CastsProperty
{
    public function unserialize(mixed $value): DateTimeInterface
    {
        return new DateTime($value);
    }
    
    public function serialize(mixed $value): string
    {
        return $value->format('Y-m-d');
    }
}

映射

您可以使用Map属性将嵌套属性映射到扁平结构

use Antwerpes\DataTransferObject\Attributes\Map;

class User extends DataTransferObject
{
    #[Map(from: 'address.city', to: 'address.city')]
    public string $city;
}

验证

验证不在本包的范围内,请使用JSON模式或如symfony/validator等其他库来验证对象。

变更日志

有关最近更改的更多信息,请参阅CHANGELOG

贡献

欢迎贡献!在GitHub上提交问题,或创建一个Pull Request。

致谢

许可

MIT许可(MIT)。有关更多信息,请参阅许可文件