首页 > 解决方案 > 哪个是最佳实践?身份类型或设置动态属性运行时?

问题描述

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

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

现在我有以下问题:

POST有效,因为我没有id在体内发送。但是,PATCH如果我在对象创建后动态设置属性是否可以?例如:

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

标签: phplaraveldesign-patternsdomain-driven-design

解决方案


与 DDD 不同,您的观点非常技术性。

您应该根据业务规则(不变量)设计聚合和嵌套实体。

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

这不是真的。在某些情况下,本地值对象(来自远程聚合,在另一个有界上下文中)需要一个 ID 属性才能保持最新(即通过后台任务)。反腐败层需要这个属性,所以原因是纯技术的。

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

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

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

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


推荐阅读