matthiasnoback/convenient-immutability

使对象最初不一致,但最终不可变

v0.3.0 2020-02-03 08:51 UTC

This package is auto-updated.

Last update: 2024-08-29 04:19:51 UTC


README

警告:我还没有在现实环境中使用这个库 - 如果它在你的情况下工作,请让我知道

Build Status Coverage Status Latest Version on Packagist Total Downloads Software License

安装

只需运行

composer require matthiasnoback/convenient-immutability

介绍

我经常遇到以下情况(特别是在处理命令对象时)。

  1. 我从一个非常简单的对象(实际上是一个DTO)开始,它只有一些公共属性。
  2. Symfony表单组件将一些值复制到对象的属性中。
  3. 然后我将一些额外的数据复制到对象中(例如生成的UUID)。
  4. 然后我将这个对象用作命令或查询消息,并将其交给应用程序的某个内部层。

换句话说,我有一个看起来像这样的类

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)。有关更多信息,请参阅许可证文件