对于 PHP 中的 DDD,我们如何准确地保护非根聚合中实体的方法?

For DDD in PHP, how do we exactly protect methods on an entity in an aggregate that is not the root?

对于 PHP 中的 DDD,我们如何准确地保护非根聚合中实体的方法?我们如何保护它们不在聚合外部使用(因为只能使用聚合根上的方法)?

奖金:还有,有重复的实体是正常的吗?我的意思是,在哪里发现相同的 product 实体 class 是两个单独聚合体中的子实体?这两个 product classes 都具有相同的 behaviors/rules 来处理 "product" 的领域概念。但是我复制了 class 因为,再一次,不应在其聚合之外访问实体。

您不公开那些实体,基本上您的 AR 不应该 return 它的一个实例。但在实践中,我没有遇到这个问题,主要是因为我的聚合 99% 是由 1 个实体 + 一堆价值 objects.

奖励:您的聚合定义了概念。实体和值 object 只是具有业务含义的 object 的技术术语,因此它们是概念的实现。每个有界上下文的产品概念应该是唯一的。

当另一个概念以某种方式引用(并不意味着它包含)产品时,它实际上处理产品 ID,这又是更多的技术实现细节。从业务角度来看,每个上下文都有一个独特的概念(聚合)。

由于聚合应包含 object定义概念,因此使用了重复的实体'inside' 总计是 99.99% 的建模不当迹象。

聚合不仅仅是一组实体,其中一个实体充当其他实体的容器。那是 100% 错误的。聚合包含所有 object 需要 以正确定义业务概念。聚合根 从来不是 容器,它是 object 负责维护聚合一致性的(这就是为什么你必须只使用它)。

对于 parents 持有 children 有数据库和存储库模式。