为PHP 7.4+提供的强类型数据传输对象,无魔法特性

2.3.1 2022-12-14 13:49 UTC

README

Latest Stable Version Total Downloads License GitHub Build Status

为PHP 8.0+提供的强类型数据传输对象,无魔法特性。支持PHP 8的联合类型属性

内容

安装

composer require romanzipp/dto
  • 对于PHP 7.4,请使用1.x
  • 对于PHP 8.0,请使用2.x

用法

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的启发。