bssphp / dto
为PHP 7.4+设计的强类型数据传输对象,无魔法属性。
1.4
2023-01-16 16:06 UTC
Requires
- php: ^8.0
- ext-json: *
Requires (Dev)
- bssphp/php-cs-fixer-config: ^1.3
- friendsofphp/php-cs-fixer: ^3.0
- phpstan/phpstan: ^0.12.99|^1.0
- phpunit/phpunit: ^9.0
- symfony/var-dumper: ^5.1
README
为PHP 8.0+设计的强类型 数据传输对象,无魔法属性。支持PHP 8的 联合类型 和 属性。
内容
安装
composer require bssphp/dto
用法
use bssphp\dto\AbstractData; use bssphp\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 bssphp\dto\AbstractData; use bssphp\dto\Attributes\Required; class DummyData extends AbstractData { #[Required] public string $name; } $data = new DummyData([]);
bssphp\dto\Exceptions\InvalidDataException: 必需属性 `name` 缺失
数组方法
简单数组表示
要获取dto的数组表示形式,只需调用toArray
实例方法。
在将dto属性转换为数组格式时,该包将尊重并调用嵌套dto实例的任何toArray
方法,或者当实现JsonSerializable
接口时回退到任何声明的jsonSerialize
方法。
use bssphp\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 bssphp\dto\AbstractData; use bssphp\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 bssphp\dto\AbstractData; use bssphp\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
致谢
此包受Spaties Data-Transfer-Object的启发,该对象在MIT许可下发布。