【发布时间】:2013-07-12 05:52:09
【问题描述】:
我有一个 PHP MVC 应用程序,我的“M”有一个服务层、映射器层和域层。我应该在哪里以及如何检查以确保对象具有所有必需的属性?
在我看来,这些职责不属于映射器或服务层,因此离开了领域层本身。我在我的基础域类中放置了一个方法checkRequired()。它根据$_required 属性数组检查对象的属性,如果缺少任何属性,则会引发错误。
从数据库中检索对象时,我一直调用checkRequired() 作为对象构造函数中的最后一个命令。如果对象是新实体(即未从数据库中检索),我会提供一些默认值(在构造函数中),然后调用 checkRequired()。
虽然这一直运行良好,但我现在开始在我的(有点贫乏的)域对象上放置一些行为方法,但我遇到了麻烦。例如,一个用户可以拥有许多宠物,所以在我的用户模型上,我放置了一个addPet() 方法。我知道我需要传入 Pet 对象,因为最好注入依赖项,因此我真正的方法签名是User::addPet(ConcretePet)。
但这就是问题所在!如果没有用户(作为它们的所有者),我的宠物就无法存在,所以我无法实例化 ConcretePet!我可以让宠物上的用户可选,但这将是一个倒退。我可以将checkRequired() 的内容移动到其他地方,但是在哪里?
解决这种常见问题的典型方法是什么?
【问题讨论】:
-
看来,如果一个Pet需要有一个User,那么应该将User传递给ConcretePet的构造函数
-
或者你可以在用户上创建一个工厂方法来创建一个 ConcretePet
-
我不会回答你的问题(已经回答了),而是评论 checkRequired() 方法。这种显式检查方法不应该是您的 API 的一部分,可能隐藏在您的聚合根中。您的构造函数应该足以为干净的实体实例化(和检查不变量)提供数据。如果不是,请使用 Factory。
标签: php design-patterns domain-driven-design