php - DDD 中实体之间的关系

标签 php oop domain-driven-design

我是 DDD 的初学者,围绕小而简单的领域工作,以便让我了解所有设计原则。

我有这个简单的域:机构 (Institution) 及其可用的 WiFi 热点 (Place) 保存在数据库中。没有机构,任何地方都无法存在。机构有管理者用户-受让人(User),它有权添加新的地方,重新分配或删除现有的地方。

Code can be found here .对值对象的验证暂时留在后面。

这受 Mathias Verraes on child entities 影响.

它是正确的 DDD 设计吗?或者至少接近它?

作为一个以数据为中心的程序员,我仍然想知道如果经验法则是通过聚合根访问聚合,我将如何列出所有机构的所有位置?

在实体本身 (Place::create) 中生成 Uuid 的想法好吗?

只有受让人(用户)可以添加/删除位置的想法应该在域本身上表达,还是应该由客户负责?在这种情况下,如果受让人知道他管理的机构(User 中的institutionId?)将是明智的。

Institution::placeById 是否违反了 DDD 的任何原则?也许这是存储库的责任?

最佳答案

聚合根规则只适用于写端。如果有专用的读取模型,这个问题就会消失。您应该可以自由转换以阅读适合您的用户场景的模型。

否则,您可以将机构中的所有地点添加到散列集,然后返回扁平化列表。

在设计聚合根时,请考虑更新场景。地点可以独立于机构更新吗?如是。那么它可能是它自己的聚合根。

通常存储库应该确定下一个 ID。

通过包含权限列表的角色表达用户权限。在每个方法中传递发件人并检查方法内部的访问权限。这也允许轻松测试访问权限。

关于php - DDD 中实体之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40867639/

相关文章:

php - 这个方法属于哪个类?

PHP : email sending failed with more than one attachment

oop - Smalltalk-80 实现中方法的参数计数限制

domain-driven-design - 滴滴。共享内核?还是纯事件驱动的微服务?

architecture - DDD、封装和分层架构 : Is my domain too anaemic?

c# - DDD - POCO。第一步

php - 如何删除具有最少信息集的重复行?

php - 如何获取属性名称而不是变体中的 slug?

c++ - 双重声明 C++

java - 当有很多属性时,不在 Java 中使用 set 和 get 方法