php - MVC - 用户输入验证 : controller, 模型或两者

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

<分区>

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

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

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

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

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

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

在这个例子中, Controller 和模型可以被看作是一种伙伴关系,模型是一个脾气暴躁的完美主义者,他将验证他从 Controller 获得的输入,而不管这些努力尝试的亲切伙伴的行为满足他所有的愿望。但这样的关系不是非常低效吗?

最佳答案

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

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

关于php - MVC - 用户输入验证 : controller, 模型或两者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18113448/

相关文章:

php - 使用关键字以编程方式执行谷歌搜索

c# - 避免在主窗体顶部使用全局变量的良好设计模式是什么?

c++ - 推荐的 C++ 库设计

java - 如何区分设计模式和标准多态性

ruby-on-rails - 对 Rails 一无所知......请揭开如何跨 Controller View 和模型使用变量的神秘面纱

c# - 对在存储库模式中使用构造函数感到困惑

php - 如何从一个网站访问另一个网站的数据库

php - 如何在 PHP 中将 UTF8 转换为 LITHUANIAN_CI_AS?

php - 搜索数据库以匹配用户输入时出现问题

php - 谁应该捕获我的 $_POST 数据 : controller or model?