5

我知道这样的问题在 stackoverflow 上已经被问过很多次了,但是即使在阅读了这些问题之后,我仍然感到困惑。我想通过用一个例子演示一个问题来明确应该在哪里处理表单验证。

假设我的网站上有一个表单,其中包含有人填写并随后提交的字段。模型希望控制器正确地传递这个值,以便在内部处理这个值。模型通过函数 接收输入,该函数getInput设置以下规则:

  • 输入必须是字符串类型。
  • 输入必须大于 0 且小于或等于 100 个字符。
  • 输入必须与电子邮件地址的模式匹配。

getInput如果这些条件中的任何一个不满足,我想我应该在里面抛出一个异常;毕竟,控制器传递的值与模型设置的规则不匹配。

除了上述规则之外,控制器(至少我相当确定这适用于控制器)还必须首先验证输入值是否已设置,然后脚本继续执行其他三个规则。

现在我的问题是:这(4)条规则中的哪一条由控制器验证,哪些由模型验证?很明显,控制器知道模型请求什么,因此它可以适应它(如果不知道,它可能会面临抛出异常的后果)。另一方面,拥有多个控制器似乎是多余的,它们都使用模型及其getInput,验证相同类型的字符串以匹配模型设置的规则。此外,如果控制器首先验证输入是否具有正确的长度 - 例如 - 并且模型在此之后立即执行完全相同的操作,一旦getInput被调用,似乎会出现更多的冗余。

在示例中,控制器和模型可以被视为合作伙伴关系,模型是一个脾气暴躁的完美主义者,他将验证他从控制器获得的输入,而不管这些努力为他提供服务的热心合作伙伴的行为如何带着他所有的欲望。但是这样的关系不是非常低效吗?

4

2 回答 2

2

您的控制器唯一应该关心的是如何将数据传递给模型以及(可选地)如何询问它们是否有效。实际验证应该在模型内部完成,因为:

  • 验证将要使用的数据您的模型的责任。
  • 您希望能够在不重复自己的情况下重用该模型。
  • 您希望能够替换模型对象(例如,使用一组完全不同的验证规则定义一个子类)并且您的控制器不应该关心。
于 2013-08-07T21:48:33.173 回答
0

这取决于。

DRY 的最佳案例(不要重复自己)在模型中验证。

然而。在某些情况下,您需要执行的验证可能是针对某个视图量身定制的,尽管这些视图可能有不同的要求,但来自两者的输入可能对模型有效。

通常我们的模型基于数据库模式验证安全输入,而可以通过表单验证的控制器,甚至模型上的方法,可能会关注更具体的验证。

为您的特定目的验证表单输入和验证模型是否正确并不总是一回事。

于 2013-08-07T20:59:30.837 回答