matthiasnoback / convenient-immutability
使对象最初不一致,但最终不可变
v0.3.0
2020-02-03 08:51 UTC
Requires
- php: >=7.2
Requires (Dev)
- phpunit/phpunit: ^8.5
- ramsey/uuid: ^3.9
- satooshi/php-coveralls: ^2.2
- symfony/form: ^4.2
This package is auto-updated.
Last update: 2024-08-29 04:19:51 UTC
README
警告:我还没有在现实环境中使用这个库 - 如果它在你的情况下工作,请让我知道
安装
只需运行
composer require matthiasnoback/convenient-immutability
介绍
我经常遇到以下情况(特别是在处理命令对象时)。
- 我从一个非常简单的对象(实际上是一个DTO)开始,它只有一些公共属性。
- Symfony表单组件将一些值复制到对象的属性中。
- 然后我将一些额外的数据复制到对象中(例如生成的UUID)。
- 然后我将这个对象用作命令或查询消息,并将其交给应用程序的某个内部层。
换句话说,我有一个看起来像这样的类
class OrderSeats { public $id; public $userId; public $seatNumbers = []; }
并且像这样使用它
$form = $this->factory->create(OrderSeatsFormType::class); $form->submit($request); $command = $form->getData(); $command->id = Uuid::uuid4(); $commandBus->handle($command);
然后我想要它无法更改(命令)对象上的任何字段,使其实际上不可变。
ConvenientImmutability\Immutable
特质解决了这个问题。当您的类使用这个特质时,它
- 允许表单组件等以任何它们喜欢的顺序将任何内容放入您的对象中。
- 允许您通过简单地访问其(公共)变量来获取数据。
- 不允许任何人覆盖之前设置的数据。
你为什么要这样做呢?
- 为了在使用你希望不可变的对象中的公共属性时感到不那么不安全。
- 为了防止意外写入你认为不可变的对象。
这种方法的缺点是什么?
- 你的对象可能是不变的...
- 但它们仍然可能处于不一致的状态。
这很糟糕吗?我不这么认为。只要你在将对象(例如使用Symfony验证器)进行验证后,再将它们抛入包含实际防止不一致状态的域层,就没有问题。
(你还可以在其他应用程序部分中使用公共属性并将它们视为“一旦设置,永不更改”。)
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。