phpgears / dto
适用于PHP的通用不可变数据传输对象
Requires
- php: ^7.1
- phpgears/immutability: ~0.2.3
Requires (Dev)
- brainmaestro/composer-git-hooks: ^2.8
- friendsofphp/php-cs-fixer: ^2.16
- infection/infection: ^0.13|^0.15
- overtrue/phplint: ^1.2
- phpmd/phpmd: ^2.8
- phpstan/extension-installer: ^1.0.3
- phpstan/phpstan: ^0.12
- phpstan/phpstan-deprecation-rules: ^0.12
- phpstan/phpstan-strict-rules: ^0.12
- phpunit/phpunit: ^7.5|^8.0
- povils/phpmnd: ^2.1
- roave/security-advisories: dev-master
- sebastian/phpcpd: ^4.0
- squizlabs/php_codesniffer: ^3.5
- thecodingmachine/phpstan-strict-rules: ^0.12
This package is auto-updated.
Last update: 2024-08-25 04:49:24 UTC
README
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\AbstractDTO
或 Gears\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\AbstractDTO
和 Gears\DTO\AbstractScalarDTO
的区别在于后者确保所有有效负载要么是标量值(null、字符串、int、float或bool),要么是标量值的数组。它的目的是确保对象可以安全地序列化,它是创建领域事件或CQRS命令/查询的完美选择
最后,Gears\DTO\AbstractDTOCollection
是一种特殊的DTO类型,它只接受元素的列表,这些元素本身是DTO接口的实现。此对象旨在用作当应该返回多个DTO时的返回值,例如从DDBB查询结果中返回
您可以利用DTO对象的魔术方法__call来访问参数。如果您打算使用此功能,最好在类级别上使用@method
phpDoc标签注释此魔术访问器,这将有助于您的IDE自动完成
贡献
发现了一个错误或有一个功能请求? 请打开一个新问题。在打开新问题之前先看看现有的问题。
参见CONTRIBUTING.md文件
许可证
有关许可证条款的副本,请参阅源代码中包含的LICENSE文件。