petrenkoanton / php-dto
自定义DTO实现
v2.0.0
2024-02-22 13:37 UTC
Requires
- php: ^8.1
- petrenkoanton/key-normalizer: ^2.0
- petrenkoanton/php-collection: ^1.0
Requires (Dev)
- php-coveralls/php-coveralls: ^2.7
- phpunit/phpunit: ^9.0
- psalm/plugin-phpunit: ^0.18.4
- ramsey/coding-standard: ^2.1
- squizlabs/php_codesniffer: ^3.8
- vimeo/psalm: ^5.16
README
安装 | 功能 | 使用 | 开发者 | 许可 | 相关项目
安装
要求
- php 8.1 或更高版本
Composer
composer require petrenkoanton/php-dto
功能
公共方法
DTO
所有getter方法都通过__call()
魔术方法提供。
DTO集合
父类 Collection
github.com/PetrenkoAnton/php-collection
异常
主库异常是DtoException。
有3组异常:InitDtoException, SetupDtoException和HandleDtoException
使用方法
初始化
- 您的DTO类必须扩展
Dto\Dto
抽象类。 - 您需要声明可用的
protected
属性。
重要!如果属性是bool
类型,getter将带有前缀is*
。
简单DTO
<?php declare(strict_types=1); use Dto\Dto; /** * @method int getPrice() * @method string getType() * @method array getInfo() * @method bool isAvailable() */ class ProductDto extends Dto { protected int $price; protected string $type; protected array $info; protected bool $available; } // Array or instance of Arrayable interface $info = [ 'key' => 'value', ]; $data = [ 'price' => 999, 'type' => 'ticket', 'info' => $info, 'available' => true, ]; $dto = new ProductDto($data); $price = $dto->getPrice(); // 999 $type = $dto->getType(); // 'ticket' $info = $dto->getInfo(); // ['key' => 'value'] $available = $dto->isAvailable(); // true
嵌套DTO(带有集合和枚举)
<?php declare(strict_types=1); use Collection\Arrayable; use Dto\Dto; use Dto\DtoCollection; /** * @method string getName() * @method int getAge() */ class PersonDto extends Dto { protected string $name; protected int $age; } class PersonDtoCollection extends DtoCollection { public function __construct(PersonDto ...$items) { parent::__construct(...$items); } } /** * @method int getPrice() * @method string getType() * @method array getInfo() * @method bool isAvailable() */ class ProductDto extends Dto { protected int $price; protected string $type; protected array $info; protected bool $available; } enum ColorEnum: string { case Red = 'red'; case Black = 'black'; case White = 'white'; } /** * @method PersonDtoCollection getPersons() * @method ProductDto getProduct() * @method ColorEnum getColor() */ class NestedDto extends Dto { protected PersonDtoCollection $persons; protected ProductDto $product; protected ColorEnum $color; } class NestedDtoFactory { public function create(array $data): NestedDto { return new NestedDto($data); } } class InfoArrayable implements Arrayable { public function toArray(): array { return [ 'key' => 'value', ]; } } $data = [ 'persons' => [ [ 'name' => 'Alice', 'age' => 25, ], [ 'name' => 'Bob', 'age' => 30, ], ], 'product' => [ 'price' => 999, 'type' => 'ticket', 'info' => new InfoArrayable(), 'available' => true, ], 'color' => 'red', ]; $nestedDto = (new NestedDtoFactory())->create($data); $personsCount = $nestedDto->getPersons()->count() // 2 $aliceDto = $nestedDto->getPersons()->first(); $aliceName = $aliceDto->getName(); // 'Alice' $aliceAge = $aliceDto->getAge(); // 25 $bobDto = $nestedDto->getPersons()->filter( fn (PersonDto $personDto) => $personDto->getName() === 'Bob' )->first(); $bobName = $bobDto->getName(); // 'Bob' $bobAge = $bobDto->getAge(); // '30' $productDto = $nestedDto->getProduct(); $productPrice = $productDto->getPrice(); // 999 $productInfo = $productDto->getInfo(); // ['key' => 'value'] $color = $nestedDto->getColor(); // ColorEnum::Red $colorValue = $colorEnum->value; // 'red'
以数组形式返回DTO
<?php declare(strict_types=1); use Dto\Dto; use Dto\KeyCase; /** * @method int getActualNumber() * @method string getProviderName() */ class SnakeCaseDto extends Dto { protected int $actualNumber; protected string $providerName; } $data = [ 'actualNumber' => 5, 'providerName' => 'Main Provider', ]; $dto = new SnakeCaseDto($data); $array = $dto->toArray(); // ['actualNumber' => 5, 'providerName' => 'Main Provider'] $arrayWithSnakeCaseKeys = $dto->toArray(KeyCase::SNAKE_CASE); // ['actual_number' => 5, 'provider_name' => 'Main Provider']
开发者
要求
实用工具
- make
- docker-compose
设置
初始化
创建./docker/.env
make init
构建不同PHP版本的容器
php 8.1
make up81
php 8.2
make up82
php 8.3
make up83
在构建其他PHP版本的容器之前,您还需要运行此命令。这将删除网络和之前创建的容器。
make down
其他命令
进入容器
make inside
检查PHP版本
make php-v
检查包版本
make v
运行测试和linters
运行PHPUnit测试并生成覆盖率
make test-c
运行Psalm
make psalm
make phpcs
或者从容器内部运行所有-in-one命令
composer check-all