stratadox/entity-state

v0.1 2019-07-15 20:24 UTC

This package is auto-updated.

Last update: 2024-09-26 05:38:19 UTC


README

Build Status Coverage Status Scrutinizer Code Quality Infection Minimum PhpStan Level Maintainability Latest Stable Version License

安装

使用composer require stratadox/entity-state进行安装

这是什么?

此包在业务逻辑执行某个特定点建模实体状态。

该模型构建的方式是,在将自己与流程中的另一个点进行比较时,可以找到添加、更改或删除的实体之间的差异。

此外,该包还包含一个用于提取实体状态的服务。

如何使用它?

步骤 1:从Identity Map中提取实体的状态。

$originalState = Extract::state()->from($identityMap);

步骤 2:在领域中进行一些更改。

$identityMap = $identityMap->add('id-26', new Something('foo'));

$identityMap->get(User::class, '1')->changeNameTo('Chuck Norris');

$identityMap = $identityMap->remove(Foo::class, '3');

(注意:在实际生活中,您会通过存储库而不是直接访问身份图)

步骤 3:从身份图中的实体提取新状态。

$newState = Extract::state()->from($identityMap);

步骤 4:获取自原始状态捕获以来的更改。

$changes = $newState->changesSince($originalState);

步骤 5:获利。

assert($changes->added()[0]->class() === Something::class);
assert($changes->added()[0]->id() === 'id-26');

assert($changes->altered()[0]->class() === User::class);
assert($changes->altered()[0]->id() === '1');

assert($changes->removed()[0]->class() === Foo::class);
assert($changes->removed()[0]->id() === '3');

assert($changes->altered()[0]->properties()[0]->name() === 'userName');
assert($changes->altered()[0]->properties()[0]->value() === 'Chuck Norris');

名称格式化

注意,在上面的示例中,用户的姓名作为字符串值存储在属性userName中。如果相反,User类有一个Name值对象,则断言看起来更像是这样

assert($changes->altered()[0]->properties()[0]->name() === 'Name:userName.name');

如果这个Name对象包含在一个数组中,结果将类似于这样

assert($changes->altered()[0]->properties()[0]->name() === 'Name:array:userName[0].name');

值格式化

在某些情况下,可能更倾向于存储实例的字符串表示,而不是所有属性。要提取类对象的字符串表示,可以使用

$entityState = Extract::stringifying(UuidInterface::class)->from($identityMap);

待办事项

潜在待办事项

  • 通过哈希属性名称来提高性能?
  • 将名称拆分为部分?
  • 添加查询属性的方法?
  • 使属性可导出以进行活化