petrenkoanton/php-dto

自定义DTO实现

v2.0.0 2024-02-22 13:37 UTC

This package is auto-updated.

Last update: 2024-09-22 15:36:25 UTC


README

PHP Version Latest Version on Packagist Total Downloads License

PHP Composer Coverage Status type-coverage psalm-level Build Status

安装 | 功能 | 使用 | 开发者 | 许可 | 相关项目

安装

要求

  • 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']

开发者

要求

实用工具

设置

初始化

创建./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

运行PHP_CodeSniffer

make phpcs

或者从容器内部运行所有-in-one命令

composer check-all

许可

php-dto库是开源软件,采用MIT许可

相关项目