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

use*_*613 5 php architecture model-view-controller design-patterns structure

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

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

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

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

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

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

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

Gav*_*vin 0

这取决于。

在模型中进行 DRY(不要重复)验证的最佳情况。

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

通常,我们的模型基于数据库模式来验证安全输入,而可以通过表单甚至模型上的方法进行验证的控制器可能会关心哪个更特定目的的验证。

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