1

我最近将表单数据验证移到了模型层,特别是在域对象设置器中(这是对还是错?)。当我在我的User服务中并且我这样做时

$user->setFirstName($firstName);

并且输入太长(超过 25 个字符)我应该将域对象中的某种state变量设置为不稳定(可能 = 0)并在模型中设置错误消息以在视图中检索吗?

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

这是正确的方法吗?

谢谢。

4

2 回答 2

0

这更像是一个架构问题,并且有很多答案。Grails Web 框架对此采取了类似的方法,但会自动神奇地添加validate()到域对象中。CodeIgniter 让您推出自己的类似.

就个人而言,我喜欢将验证逻辑放入设置器/构造器中,如果我的先决条件不满足,则抛出异常。这意味着您的视图不必询问对象以查看它是否有效,而是您的用户必须确保他们输入有效数据或在不输入有效数据时显式处理。

于 2013-02-24T09:50:31.223 回答
0

我想说表单验证与域对象无关。如果提交的表单无效,通常根本没有理由创建/修改域对象,这完全是表现层/用户界面的问题。将用户输入的验证放入域对象中违反了关注点分离原则。

然而,这是一个有争议的问题,没有绝对正确或错误的方法。因为如果你想确保域对象不能处于无效状态(在构造函数和设置器中抛出异常),你最终可能会得到重复的代码。

但是,如果您在域对象中使用验证来进行表单验证,那么您应该更喜欢异常而不是isValid状态。对象应始终处于有效状态,这是 OOP 的一大优势

更新

对于我放置输入验证的问题:我为每个控制器使用专门的请求对象,并在控制器中使用它们,如下所示:

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

这些方法也可以在控制器本身中,但我更喜欢包含尽可能少的自身逻辑的瘦控制器。另一种常见的方法是在一个地方管理表单的生成和验证的表单对象(示例:)Zend\Form。如果请求总是来自表单,这是有道理的。我上面的示例适用于 Web 服务以及 HTML 用户界面。

于 2013-02-24T10:31:21.770 回答