适用于PHP的通用不可变数据传输对象

0.3.1 2020-03-06 19:40 UTC

This package is auto-updated.

Last update: 2024-08-25 04:49:24 UTC


README

PHP version Latest Version License

Build Status Style Check Code Quality Code Coverage

Total Downloads Monthly Downloads

DTO

适用于PHP的通用不可变数据传输对象

此库提供了一种实现DTO类的方法,只要从三种不同的通用抽象DTO对象实现中扩展即可

这些DTO对象是不可变的,这要归功于 gears/immutability,这意味着一旦创建DTO,就无法更改其上的任何值(在PHP范围内)

安装

Composer

composer require phpgears/dto

用法

需要composer自动加载文件

require './vendor/autoload.php';

您可以在任何需要具有不可变DTO功能的对象中使用ImmutabilityBehaviour和PayloadBehaviour

use Gears\Immutability\ImmutabilityBehaviour;
use Gears\DTO\DTO;
use Gears\DTO\PayloadBehaviour;

class MyDTO implements DTO, MyDTOInterface
{
    use ImmutabilityBehaviour, PayloadBehaviour {
        PayloadBehaviour::__call insteadof ImmutabilityBehaviour;
    }

    public function __construct(array $parameters)
    {
        $this->assertImmutable();

        $this->setPayload($parameters);
    }

    final public function getAllowedInterfaces(): array
    {
        return [DTO::class, MyDTOInterface::class];
    }
}

如果您只需要一个普通的DTO对象,这将变得更容易,因为已经通过扩展 Gears\DTO\AbstractDTOGears\DTO\AbstractScalarDTO 类为您提供了样板代码

受保护的构造函数强制您创建"命名构造函数",这有一个非常有用的副作用,您可以对所有的DTO参数进行类型提示

use Gears\DTO\AbstractScalarDTO;

/**
 * @method hasName(): bool
 * @method getName(): string
 * @method hasLastName(): bool
 * @method getLastName(): string
 * @method hasDate(): bool
 * @method getDate(): \DateTimeImmutable
 */
class MyDTO extends AbstractScalarDTO
{
    /**
     * Custom named constructor.
     *
     * @param string $name
     * @param string $lastName
     * @param DateTimeImmutable $date
     * 
     * @return self
     */
    public static function instantiate(
        string $name,
        string $lastName,
        \DateTimeImmutable $date
    ): self {
        return new static([
            'name' => $name,
            'lastName' => $lastName,
            'date' => $date->setTimezone(new \DateTimeZone('UTC'))->format('U'),
        ]);
    }

    /**
     * Transforms 'date' parameter every time it is accessed.
     */
    protected function outputDate(string $date): \DateTimeImmutable
    {
        return DateTimeImmutable::createFromFormat('U', $date);
    }
}

Gears\DTO\AbstractDTOGears\DTO\AbstractScalarDTO 的区别在于后者确保所有有效负载要么是标量值(null、字符串、int、float或bool),要么是标量值的数组。它的目的是确保对象可以安全地序列化,它是创建领域事件或CQRS命令/查询的完美选择

最后,Gears\DTO\AbstractDTOCollection 是一种特殊的DTO类型,它只接受元素的列表,这些元素本身是DTO接口的实现。此对象旨在用作当应该返回多个DTO时的返回值,例如从DDBB查询结果中返回

您可以利用DTO对象的魔术方法__call来访问参数。如果您打算使用此功能,最好在类级别上使用@method phpDoc标签注释此魔术访问器,这将有助于您的IDE自动完成

贡献

发现了一个错误或有一个功能请求? 请打开一个新问题。在打开新问题之前先看看现有的问题。

参见CONTRIBUTING.md文件

许可证

有关许可证条款的副本,请参阅源代码中包含的LICENSE文件。