mhmdmnsr / super-simple-dto
利用PHP对象的力量创建数据传输对象
v1.4.0
2024-05-11 07:18 UTC
Requires
- php: ^8.1
- laravel/framework: ^8.0|^9.0|^10.0|^11.1
Requires (Dev)
- laravel/pint: ^1.2
- mockery/mockery: ^1.5
- phpunit/phpunit: ^9.5
- spatie/ray: ^1.28
This package is auto-updated.
Last update: 2024-09-11 08:01:55 UTC
README
利用PHP对象的力量创建数据传输对象。无需PHP属性、无需反射API,无需其他钩子工作。
这是一个Laravel包,且laravel/framework
是该包的依赖之一。请在使用之前确保您没有问题。
为什么这么做。
spatie团队已经创建了一个非常棒的包,它作为DTO对象的一个优秀解决方案。但是,对我来说,它包含了太多我不需要的功能,当我只想为DTO工作提供一个简单解决方案时,这对我来说似乎有点过度。
安装
您可以通过composer安装此包
composer require mohammedmanssour/super-simple-dto
使用方法
- 将
AsDTO
特质应用于您的数据对象
use MohammedManssour\DTO\Concerns\AsDTO; class UserData { use AsDTO; public string $name; public string $email; public BalanceData $balance; public Status $status; }
- 使用以下静态方法之一将数据转换为DTO
fromCollection
:将集合转换为DTO对象。fromArray
:将数组转换为DTO对象。fromModel
:将模型转换为DTO对象。它使用$model->getAttributes()
方法提供的数据。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)。请参阅许可证文件以获取更多信息。