哪个是最佳做法?身份类型还是设置动态属性运行时?

时间:2019-01-16 23:59:51

标签: php laravel design-patterns domain-driven-design

在设计类时,我假设拥有一个$id属性将使该类Entity而不是值对象。

我还有一个toArray()方法,该方法将对象转换为关联数组,并将响应发送到post和patch api。

现在我有以下问题:

POST有效, 因为我没有在正文中发送id。但是对于PATCH,如果在创建对象后动态设置属性就可以了吗?例如:

$redCircle = new Circle(“red”);
$redCircle->id = 10;
$api->patch($redCircle->toArray());

1 个答案:

答案 0 :(得分:0)

与DDD相比,您的观点非常技术性。

您应根据业务规则(不变式)设计汇总和嵌套实体。

  

在设计类时,我假设拥有$ id属性将使该类成为Entity而不是值对象。

这不是事实。在某些情况下,本地Value对象(在另一个Bounded上下文中来自远程Aggregate)需要ID属性以便保持最新(即通过后台任务)。反腐败层将需要此属性,因此原因纯粹是技术性的。

  

POST有效,因为我没有在正文中发送ID。但是对于PATCH,如果在创建对象后动态设置属性就可以了吗?

同样,这不是该问题的DDD视图。在DDD中,一个Aggregate执行命令:一个不简单地直接更新其内部状态;另一个不简单地直接更新其内部状态。这将破坏其封装。

但是要回答您的问题,请考虑您拥有一个CRUD应用程序:为了对实体的某些部分进行突变,您需要在突变之前从Repository加载它。存储库将设置ID以及其他属性。

查找实体的最佳方法之一是使用RESTful API,因此客户端无需为PATCH操作构造URL。