romanzipp / dto
为PHP 7.4+提供的强类型数据传输对象,无魔法特性
2.3.1
2022-12-14 13:49 UTC
Requires
- php: ^8.0
- ext-json: *
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- phpstan/phpstan: ^0.12.99|^1.0
- phpunit/phpunit: ^9.0
- romanzipp/php-cs-fixer-config: ^3.0
- symfony/var-dumper: ^5.1
README
为PHP 8.0+提供的强类型数据传输对象,无魔法特性。支持PHP 8的联合类型和属性。
内容
安装
composer require romanzipp/dto
用法
use romanzipp\DTO\AbstractData; use romanzipp\DTO\Attributes\Required; class DummyData extends AbstractData { #[Required] public string $name; public ?string $nickname; public string|int $height; public DateTime $birthday; public bool $subscribeNewsletter = false; } $data = new DummyData([ 'name' => 'Roman', 'height' => 180, ]);
需要属性
当声明需要属性时,DTO将验证所有参数与声明的属性。有关详细信息,请参阅验证表。
use romanzipp\DTO\AbstractData; use romanzipp\DTO\Attributes\Required; class DummyData extends AbstractData { #[Required] public string $name; } $data = new DummyData([]);
romanzipp\DTO\Exceptions\InvalidDataException: 必需的属性 `name` 缺失
数组方法
简单数组表示
要获取DTO的数组表示,只需调用实例方法toArray
。
当将DTO属性转换为数组格式时,该包将尊重并调用任何嵌套DTO实例的toArray
方法,或者在没有实现JsonSerializable
接口时回退到任何声明的jsonSerialize
方法。
use romanzipp\DTO\AbstractData; class DummyData extends AbstractData { public string $firstName; public DummyData $childData; /** @var self[] */ public array $children = []; } $data = new DummyData([ 'firstName' => 'Roman', 'childData' => new DummyData([ 'firstName' => 'Tim', ]), 'children' => [ new DummyData([ 'firstName' => 'Tom' ]), ], ]); $data->toArray(); // [ // 'firstName' => 'Roman', // 'childData' => ['firstName' => 'Tim'] // 'children' => [ // ['firstName' => 'Tom'] // ] // ];
转换键
toArrayConverted
方法允许将属性键简单地转换为给定的格式。
use romanzipp\DTO\AbstractData; use romanzipp\DTO\Cases; class DummyData extends AbstractData { public string $firstName; } $data = new DummyData([ 'firstName' => 'Roman', ]); $data->toArrayConverted(Cases\CamelCase::class); // ['firstName' => 'Roman']; $data->toArrayConverted(Cases\KebabCase::class); // ['first-name' => 'Roman']; $data->toArrayConverted(Cases\PascalCase::class); // ['FirstName' => 'Roman']; $data->toArrayConverted(Cases\SnakeCase::class); // ['first_name' => 'Roman'];
灵活的DTO
当附加Flexible
属性时,你可以提供比DTO实例中声明的更多参数。所有属性也将包含在toArray
方法中。否则将抛出InvalidDataException
。
use romanzipp\DTO\AbstractData; use romanzipp\DTO\Attributes\Flexible; #[Flexible] class DummyData extends AbstractData { public string $name; } $data = new DummyData([ 'name' => 'Roman', 'website' => 'ich.wtf', ]); $data->toArray(); // ['name' => 'Roman', 'website' => 'ich.wtf];
验证
* 带默认值的属性不能是必需的。
测试
./vendor/bin/phpunit
致谢
此包受到了在MIT许可证下发布的Spaties Data-Transfer-Object的启发。