bssphp/dto

为PHP 7.4+设计的强类型数据传输对象,无魔法属性。

1.4 2023-01-16 16:06 UTC

This package is auto-updated.

Last update: 2024-09-16 19:33:54 UTC


README

Latest Stable Version Total Downloads License GitHub Build Status

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

内容

安装

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

用法

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许可下发布。