我知道这样的问题在 stackoverflow 上已经被问过很多次了,但是即使在阅读了这些问题之后,我仍然感到困惑。我想通过用一个例子演示一个问题来明确应该在哪里处理表单验证。
假设我的网站上有一个表单,其中包含有人填写并随后提交的字段。模型希望控制器正确地传递这个值,以便在内部处理这个值。模型通过函数 接收输入,该函数getInput
设置以下规则:
- 输入必须是字符串类型。
- 输入必须大于 0 且小于或等于 100 个字符。
- 输入必须与电子邮件地址的模式匹配。
getInput
如果这些条件中的任何一个不满足,我想我应该在里面抛出一个异常;毕竟,控制器传递的值与模型设置的规则不匹配。
除了上述规则之外,控制器(至少我相当确定这适用于控制器)还必须首先验证输入值是否已设置,然后脚本继续执行其他三个规则。
现在我的问题是:这(4)条规则中的哪一条由控制器验证,哪些由模型验证?很明显,控制器知道模型请求什么,因此它可以适应它(如果不知道,它可能会面临抛出异常的后果)。另一方面,拥有多个控制器似乎是多余的,它们都使用模型及其getInput
,验证相同类型的字符串以匹配模型设置的规则。此外,如果控制器首先验证输入是否具有正确的长度 - 例如 - 并且模型在此之后立即执行完全相同的操作,一旦getInput
被调用,似乎会出现更多的冗余。
在示例中,控制器和模型可以被视为合作伙伴关系,模型是一个脾气暴躁的完美主义者,他将验证他从控制器获得的输入,而不管这些努力为他提供服务的热心合作伙伴的行为如何带着他所有的欲望。但是这样的关系不是非常低效吗?