我对DDD(域驱动设计)在过去几天感兴趣,但我无法弄清谁创建和验证实体的责任。我会打破这个问题以涵盖不同的场景。DDD - 实体创建和验证责任
正则实体(可能带有值对象)。举一个例子,让我们接受一个由电子邮件标识的用户。我有一个UserFactory接收一组数据(可能来自POST表单),并返回一个新的UserEntity。工厂是否应该验证数据的完整性(例如:Email给的字符串是真实的电子邮件,密码字段1和字段2的密码等)?工厂应该验证没有这样的用户存在(我们不想使用同一封电子邮件注册两个用户)?如果是的话,它应该做我自己还是使用UserRepository?
集合实体。让我们假设我们有一个Post实体和评论实体。我想获得所有评论12后,所以我做类似
$ post = $ postRepository-> getById(12);
getById应该如何实现?像这样:
public function getById($id) {
$postData = $this->magicFetchFromDB($id);
$comments = (new CommentRepository())->getForPost(12);
return new PostEntity($postData, $comments);
}
或者这个职位负责懒人创造的意见,是这样的:
class PostEntity {
public function getComments() {
if(is_null($this->_comments)) $this->_comments = (new CommentRepository())->getForPost($this->_id);
return $this->_comments;
}
}
? 我在这里很迷茫,没有足够的信息与PHP中的DDD的例子,所以任何帮助将不胜感激!
非常感谢, skwee。
感谢您的评论! A)我不确定是否要在实体中进行验证。你会考虑验证captcha是否是业务逻辑的一部分?如果我有管理面板手动添加用户而不需要验证码? B)是的我可以,但问题是这是谁的责任?验证图层?厂?库? C)好吧,但是如果我的用户有帖子发表评论,如果加载所有这些数据以显示用户个人资料页面,这会很聪明吗? – 2012-02-08 21:35:32
a)它确实取决于您的需求,我发现使用助手类在实体本身进行验证“更容易”。但增加一层额外的验证非常好。 b)我会说这是验证层的责任。如果两个账户不能有相同的号码,并且您尝试添加一个已经存在的号码,这意味着该实体** ** **,或者至少这就是我的想法。 – jere 2012-02-09 18:02:13
c)这也取决于你想要什么。如果您要在个人资料页面上一次显示所有信息,那么请在一次调用中加载所有信息。但是如果你展示的是,只能发布帖子,并且当你点击一个显示评论的时候,最好在那一刻加载评论,或许使用ajax – jere 2012-02-09 18:03:14