mhmdmnsr/super-simple-dto

利用PHP对象的力量创建数据传输对象

v1.4.0 2024-05-11 07:18 UTC

README

Latest Version on Packagist Tests Total Downloads

利用PHP对象的力量创建数据传输对象。无需PHP属性、无需反射API,无需其他钩子工作。

这是一个Laravel包,且laravel/framework是该包的依赖之一。请在使用之前确保您没有问题。

为什么这么做。

spatie团队已经创建了一个非常棒的包,它作为DTO对象的一个优秀解决方案。但是,对我来说,它包含了太多我不需要的功能,当我只想为DTO工作提供一个简单解决方案时,这对我来说似乎有点过度。

安装

您可以通过composer安装此包

composer require mohammedmanssour/super-simple-dto

使用方法

  1. AsDTO特质应用于您的数据对象
use MohammedManssour\DTO\Concerns\AsDTO;

class UserData
{
    use AsDTO;

    public string $name;

    public string $email;

    public BalanceData $balance;

    public Status $status;
}
  1. 使用以下静态方法之一将数据转换为DTO
    1. fromCollection:将集合转换为DTO对象。
    2. fromArray:将数组转换为DTO对象。
    3. fromModel:将模型转换为DTO对象。它使用$model->getAttributes()方法提供的数据。
    4. fromRequest:将Laravel请求转换为DTO对象。它使用validated()方法提供的数据。如果validated方法不可用,它将使用all()方法。您也可以通过传递第二个参数为true来强制使用请求的all方法。
UserData::fromCollection(collect([]));

UserData::fromArray([]);

UserData::fromModel($model);

UserData::fromRequest($request);

如何填充DTO

AsDTO将根据键分配值给DTO属性,并且没有键匹配的属性将不会被初始化/分配。

$data = [
    'name' => 'Mohammed Manssour',
    'email' => 'hello@mohammedmanssour.me'
];
$dto = UserData::fromArray();

$this->assertEquals($data['name'], $dto->name);
$this->assertEquals($data['email'], $dto->email);

$this->assertFalse(isset($dto->balance));
$this->assertFalse(isset($dto->status));

处理特殊属性

如果您有一个需要特殊处理的属性,您可以在DTO中添加一个与您的属性同名的方法来处理转换。

use MohammedManssour\DTO\Concerns\AsDTO;

class BalanceData
{
    use AsDTO;

    public float $bitcoin;

    public int $usdollar;
}

enum Status: string
{
    case Active = 'active';
    case Suspended = 'suspended';
}

class UserData
{
    use AsDTO;

    ....

    public BalanceData $balance;

    public Status $status;

    public function balance($value)
    {
        return $this->balance = BalanceData::fromArray($value);
    }

    public function status($value)
    {
        return $this->status = Status::from($value);
    }
}

$data = [
    'balance' => [
        'bitcoin' => 10,
        'usdollar' => 100
    ],
    'status' => 'active'
];

$dto = UserData::fromArray($data)

$this->assertInstanceOf(BalanceData::class, $dto->balance);
$this->assertEquals($data['balance']['bitcoin'], $dto->balance->bitcoint);
$this->assertEquals($data['balance']['usdollar'], $dto->balance->usdollart);


$this->assertInstanceOf(Status::class, $dto->status);
$this->assertEquals(Status::Active, $dto->status);

将DTO转换为数组

您可以使用DTO方法将DTO转换为数组

$arr = $dto->toArray()

测试

composer test

变更日志

请参阅CHANGELOG以获取有关最近更改的更多信息。

贡献

请参阅CONTRIBUTING以获取详细信息。

安全漏洞

请参阅我们的安全策略以了解如何报告安全漏洞。

致谢

许可证

MIT许可证(MIT)。请参阅许可证文件以获取更多信息。