MVC - 用户输入验证:控制器,模型或两者

时间:2013-08-07 20:43:53

标签: php design-patterns model-view-controller architecture structure

我知道这样的问题已经在stackoverflow上被多次询问,但即使在阅读完之后,我仍然感到困惑。我希望通过演示一个示例问题来明确表格验证的处理方式。

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

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

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

除了上述规则之外,控制器(至少我确定这适用于控制器)还必须在脚本继续执行其他三个规则之前验证输入值是否已设置在第一位。< / p>

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

在这个例子中,控制器和模型可以看作是一个伙伴关系,模型是一个脾气暴躁的完美主义者,他将验证他从控制器获得的输入,无论这些亲切的伙伴努力的行动如何为他提供他所有的欲望。但这种关系不是非常低效吗?

2 个答案:

答案 0 :(得分:2)

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

  • 您的模型有责任验证 将要使用的数据。
  • 您希望能够重复使用该模型而无需重复自己。
  • 您希望能够替换模型对象(例如,使用完全不同的验证规则集定义子类),并且您的控制器不应该关心。

答案 1 :(得分:0)

取决于。

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

然而。可能存在您需要执行的验证可能是针对特定视图进行定制和特定的情况,尽管这些视图可能具有不同的要求,但两者的输入可能对模型有效。

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

为您的特定目的验证表单输入,并验证模型是否正确并不总是相同的。