stratadox / entity-state
v0.1
2019-07-15 20:24 UTC
Requires
- php: >=7.2
- stratadox/collection-contracts: ^2.1
- stratadox/hydrator-contracts: ^0.2.0
- stratadox/identity-map: ^0.5.1
- stratadox/specification-interfaces: ^1.0
Requires (Dev)
- php-coveralls/php-coveralls: ^2.0
- phpstan/phpstan: ^0.9.2
- phpunit/phpunit: ^7.1
- ramsey/uuid: ^3.7
- stratadox/immutable-collection: ^1.1
This package is auto-updated.
Last update: 2024-09-26 05:38:19 UTC
README
安装
使用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);
待办事项
潜在待办事项
- 通过哈希属性名称来提高性能?
- 将名称拆分为部分?
- 添加查询属性的方法?
- 使属性可导出以进行活化