如何在持久存在之前处理域实体验证?

joh*_*ack 5 php entity domain-driven-design

一个实体(比如一个UserEntity)对它的属性有严格的规则,它可以存在于两个状态 - 持久化(这意味着它有一个id)和预先持久化(这意味着它还id没有).

根据关于如何处理所需属性的这个问题的答案,只有id传入其构造函数才能创建"真正的"UserEntity .

但是,当我需要创建new UserEntity浏览器发送的信息时,我需要能够在持久保存到数据库之前验证信息.

在过去,我只是创建一个空白的UserEntity(没有id),设置新的属性,并验证它 - 但是,在这个新的,更安全的方式思考实体,我不应该创建一个新的UserEntity没有它的id.

我不想创建两个知道如何验证我的UserEntity属性的地方,因为如果他们改变(他们会),它将是更新代码的两倍,并使错误的机会增加一倍.

如何有效地集中我的实体属性的验证知识?

注意

我有一个想法反映在这个问题中,其中我考虑将非状态属性(如电子邮件,密码和名称)存储在标准化值对象中,该对象将了解其属性的规则,即不同的服务,如Controller,Validator,和Repo,或Mapper可以使用.

Itz*_*ban 4

这就是工厂的用途。对于工厂方法,您仅传递强制执行 UserEntity 的真正不变量所需的数据(需要一些时间来弄清楚UserEntity 的真正不变量是什么,您最好与领域专家一起完成)。

在工厂方法中,您创建一个新的 Id 并将其传递给 UserEntity 构造函数。

在这个阶段,我认为如果构造函数内的验证失败,丢弃实例并没有那么糟糕。在最坏的情况下 - 你丢失了一个 id...这种情况不会经常发生 - 大多数情况下数据应该在客户端进行验证。

当然,另一种选择是在工厂方法中首先验证参数,然后创建一个新的 Id 并将其传递给 UserEntity 构造函数。

伊齐克萨班