模型/视图/控制器模型中验证的最佳位置?

时间:2011-03-14 23:30:01

标签: php model-view-controller validation design-patterns forms

我正在开发一个广泛使用MVC设计模式的PHP项目。我希望在表单中添加验证,并且对于验证的正确位置感到好奇。

由于生成表单的方式,对回发数据的验证在视图组件中更简单,重复性更低。让视图验证响应数据是否可接受,或者是否应该在控制器甚至模型中实现?

有什么好处?

4 个答案:

答案 0 :(得分:94)

验证的正确位置是模型

这最有意义,因为您正在对数据进行验证,这是模型所代表的。就CRUD更新而言,应始终以某种方式使用模型。

  • 如果要更改数据 看,你应该有验证 被检查。

  • 如果您有控制器更改 数据,你应该有验证 被检查。

  • 最后,如果你有 模型本身改变数据,你 还应该有验证。

实现此状态的唯一方法是将验证放入模型中。

由于性能和响应速度快,在模型中实现验证后,您应该尝试添加某种客户端(JS)以立即通知最终用户。

验证始终与数据有关。你为什么要验证数据?因此,您可以保持存储信息的完整性。在模型级别进行验证可以使数据在理论上始终正确。这总是一种必要性。从那里,您可以在业务逻辑和客户端添加额外的验证,以使您的应用程序更加用户友好。

答案 1 :(得分:30)

如果你在客户端验证数据(即Javascript验证),这绝对不够,根本不安全,你应该在View中实现它。

如果您正在验证服务器端的数据,并且您的验证不需要应用程序业务逻辑(即您没有检查用户是否在其帐户中有足够的信用),您应该在控制器中进行验证。 / p>

如果验证需要业务逻辑,请在模型中实现它并通过控制器调用它。

回发验证不好,因为它会带来很多压力和延迟,唯一的好处是程序员(不被计算)。

你可以在大多数验证中使用正则表达式,它在PHP和JS上具有相同的语法。

答案 2 :(得分:1)

模型中的验证似乎是最常见的方法(最终会得到类似$obj->isValid()的内容),这在许多情况下都适用。

但是,根据您的使用情况,可能有充分的理由在模型外部执行验证,使用单独的验证代码或在控制器中等:

  • 如果大部分整体验证问题涉及模型无法访问的信息(例如,如果管理员用户可以执行常规用户无法执行的转换,或某些属性在特定日期之后无法更改),那么您可能需要在同一个地方检查所有这些约束。
  • 在构建测试对象时,应用非常宽松的验证规则也可能是方便或必要的。 (A&#34;购物篮&#34;对象通常可能需要相关用户,而后者又需要有效的电子邮件地址等.100%有效的购物篮对象可能不方便在购物篮单元测试中构建。)< / LI>
  • 由于历史原因,验证规则可能会发生变化(例如,执行&#34;性别&#34;之前没有必要),因此您最终可能会得到需要区别对待的不同版本的数据。 (不同的验证规则也可能适用于批量数据导入。)
  • 如果验证非常复杂,您可能希望提供不同的错误消息(或根本不提供错误消息),具体取决于对调用者最有用的内容。在其他情况下,truefalse可能就是必要的。

可以通过模型isValid()方法的参数来处理这些不同的用例,但随着验证样式数量的增加,这变得越来越难以处理。 (而且我认为它几乎可以保证,单个&#34;一个尺寸适合所有&#34; isValid()方法最终将证明对于大多数非平凡的项目来说是不够的。)

答案 3 :(得分:0)

不要混淆清理或清除已验证的已发布值。您应该获取已发布的值并通过从Controller中的值中删除任何恶意元素来清除它们。然后将数据发送到模型以验证预期值或格式。通过将这些操作分解为两个过程可以降低恶意代码实现的风险。如果您使用“信任无人输入”策略,此方法很有效;知道一些程序员可能变得草率或懒惰。另一个积极的方面是阻止你的模型变得臃肿和过度工作,如果是这样,那么使用模型助手来做脏工作。此方法还有助于平衡应用程序负载并提高性能。