Dmi*_*sev 5 php domain-driven-design
我在过去几天对DDD(领域驱动设计)很感兴趣,但我无法弄清楚谁创建和验证实体的责任.我会打破这个问题来涵盖不同的场景.
常规实体(可能带有价值对象).举个例子,我们可以选择一个由Email识别的用户.我有一个UserFactory接收一个数据数组(可能来自表单POST),并返回一个新的UserEntity.工厂应该验证数据的完整性(例如:作为电子邮件提供的字符串是真实的电子邮件,密码字段1和字段2中的密码匹配等)?工厂是否应该验证不存在此类用户(我们不想使用相同的电子邮件注册两个用户)?如果是,它应该是我自己还是使用UserRepository?
聚合实体.让我们假设我们有一个Post实体和Comments实体.我希望在帖子12中发表所有评论,所以我做了类似的事情
$ post = $ postRepository-> getById(12);
如何实现getById?像这样:
public function getById($id) {
$postData = $this->magicFetchFromDB($id);
$comments = (new CommentRepository())->getForPost(12);
return new PostEntity($postData, $comments);
}
Run Code Online (Sandbox Code Playgroud)
或者也许负责懒惰创建其评论的帖子,例如:
class PostEntity {
public function getComments() {
if(is_null($this->_comments)) $this->_comments = (new CommentRepository())->getForPost($this->_id);
return $this->_comments;
}
}
Run Code Online (Sandbox Code Playgroud)
?我在这里很丢失,没有足够的信息提供PHP中的DDD示例,所以任何帮助将不胜感激!
非常感谢,skwee.
工厂应该只关心创建实体。我个人更喜欢将验证放在我的视图和模型层中。我会使用一些库,例如 jQuery 的验证插件,在客户端进行一些必要的验证(例如检查必填字段是否有数据)。然后对模型进行“硬核”验证。我这样做是通过使用一个简单的 BaseEntity 抽象类来扩展所有实体,并且由于您要求提供示例,因此它是:
abstract class BaseEntity {
public function isValid();
}
class MyEntity extends BaseEntity {
public function isValid() {
//actual validation goes here
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以使用带有一些基本验证方法的静态帮助器类:
class ValidationHelper {
public static function isValidPhonenumber($value) {
//check valid phonenumber, using a regex maybe
}
public static function isAlphanumeric($value) {
//check for letters and numbers only
}
}
Run Code Online (Sandbox Code Playgroud)
许多人反对静态方法,因为它们可能会破坏单元测试,但在这种情况下,它们非常基本,并且没有外部依赖项,从而使它们“更安全”。
当涉及到检查已经存在的实体时,您可以通过查询数据库以查看该实体在添加/更新之前是否已经存在来完成此操作,或者(这就是我喜欢的方式)您可以向那些列添加unique索引不能在数据库中重复,然后将创建或更新查询包装在 try-catch 块中(例如,如果两个用户具有相同的电子邮件,查询将引发唯一约束冲突),然后显示正确的错误信息
关于你的最后一个问题,这取决于偏好问题。如果您的数据库将在 1 分钟内获得一百万次点击,那么最好使用延迟加载以避免在需要时获取不必要的数据。但是,如果您的数据库相对较小,您可以完美地使用预先加载,而不会牺牲太多性能。再次强调,这是个人喜好问题。
希望这些漫无目的的内容是有道理的,干杯!
| 归档时间: |
|
| 查看次数: |
2098 次 |
| 最近记录: |