我正在开发一个广泛使用MVC设计模式的PHP项目。我希望在表单中添加验证,并且对于验证的正确位置感到好奇。
由于生成表单的方式,对回发数据的验证在视图组件中更简单,重复性更低。让视图验证响应数据是否可接受,或者是否应该在控制器甚至模型中实现?
有什么好处?
答案 0 :(得分:94)
验证的正确位置是模型。
这最有意义,因为您正在对数据进行验证,这是模型所代表的。就CRUD更新而言,应始终以某种方式使用模型。
如果要更改数据 看,你应该有验证 被检查。
如果您有控制器更改 数据,你应该有验证 被检查。
最后,如果你有 模型本身改变数据,你 还应该有验证。
实现此状态的唯一方法是将验证放入模型中。
由于性能和响应速度快,在模型中实现验证后,您应该尝试添加某种客户端(JS)以立即通知最终用户。
验证始终与数据有关。你为什么要验证数据?因此,您可以保持存储信息的完整性。在模型级别进行验证可以使数据在理论上始终正确。这总是一种必要性。从那里,您可以在业务逻辑和客户端添加额外的验证,以使您的应用程序更加用户友好。
答案 1 :(得分:30)
如果你在客户端验证数据(即Javascript验证),这绝对不够,根本不安全,你应该在View中实现它。
如果您正在验证服务器端的数据,并且您的验证不需要应用程序业务逻辑(即您没有检查用户是否在其帐户中有足够的信用),您应该在控制器中进行验证。 / p>
如果验证需要业务逻辑,请在模型中实现它并通过控制器调用它。
回发验证不好,因为它会带来很多压力和延迟,唯一的好处是程序员(不被计算)。
你可以在大多数验证中使用正则表达式,它在PHP和JS上具有相同的语法。
答案 2 :(得分:1)
模型中的验证似乎是最常见的方法(最终会得到类似$obj->isValid()
的内容),这在许多情况下都适用。
但是,根据您的使用情况,可能有充分的理由在模型外部执行验证,使用单独的验证代码或在控制器中等:
true
或false
可能就是必要的。 可以通过模型isValid()
方法的参数来处理这些不同的用例,但随着验证样式数量的增加,这变得越来越难以处理。 (而且我认为它几乎可以保证,单个"一个尺寸适合所有" isValid()
方法最终将证明对于大多数非平凡的项目来说是不够的。)
答案 3 :(得分:0)
不要混淆清理或清除已验证的已发布值。您应该获取已发布的值并通过从Controller中的值中删除任何恶意元素来清除它们。然后将数据发送到模型以验证预期值或格式。通过将这些操作分解为两个过程可以降低恶意代码实现的风险。如果您使用“信任无人输入”策略,此方法很有效;知道一些程序员可能变得草率或懒惰。另一个积极的方面是阻止你的模型变得臃肿和过度工作,如果是这样,那么使用模型助手来做脏工作。此方法还有助于平衡应用程序负载并提高性能。