如果我的域对象有一个isValid()方法返回对象的当前状态? [关闭](Should my D

2019-09-28 20:35发布

我最近搬到我的表单数据验证模型层,特别是在领域对象setter方法(这是对还是错?)。 当我在我的User服务,我这样做

$user->setFirstName($firstName);

并且输入过长(超过25个字符)我应该设置某种state变量域对象不稳定(也许= 0),并在浏览检索模型设定错误信息?

我会通过运行检查中查看对象的状态isValid()方法。

这将是正确的方式做到这一点?

谢谢。

Answer 1:

这更是一个建筑的问题,而且有很多的答案。 在Grails的Web框架采用类似的方法来此,但自动神奇加入validate()域对象。 CI有你滚你自己的类似 。

就个人而言,我把验证逻辑setter方法/构造函数和,如果我的条件没有满足时抛出异常的粉丝。 这意味着,而不是一个对象的意见都来询问,看它是否是有效的,用户必须确保他们输入有效的数据,或者当他们这样做没有明确处理。



Answer 2:

我想说的表单验证无关,在域对象做。 如果提交的表单无效通常是没有必要创建/修改域对象的话,那是完全位于表示层/用户界面的问题。 将用户输入的验证到域对象违反的担忧原理的分离。

然而,这是一个有争议的问题,有没有做到这一点绝对正确或错误的方式。 因为如果你想确保域对象不能处于无效状态(扔在构造函数和setter例外),你可能会出现重复的代码。

但如果你的域对象使用验证表单验证或没有,你应该更喜欢一个例外isValid状态。 这些对象应始终处于有效状态,这是OOP的一个大优点

更新

为了这个问题,我把输入验证:我用专门的请求对象的每个控制器和这样的控制器使用它们:

try {
    $user = $this->request->extractUserFromPost();
} catch (ValidationException $e) {
    $this->showValidationError($e->getMessage(), $e->getAffectedFields());
}

该方法也可以在控制器本身,而是我更喜欢含有少自己的逻辑尽可能薄控制器。 另一种常见的方法是在一个地方(例如:管理产生和形式的检验形式的对象Zend\Form )。 如果请求总是来自一种形式,这是有道理的。 我上面的例子会工作的web服务,以及一个HTML的用户界面。



文章来源: Should my Domain Objects have an isValid() method to return the current state of the object? [closed]