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

Lea*_*yes 51 php forms validation model-view-controller design-patterns

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

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

有什么好处?

Mik*_*wis 98

验证的正确位置是模型.

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

  • 如果要从视图中更改数据,则应检查验证.

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

  • 最后,如果你让模型本身改变数据,你仍然应该有验证.

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

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

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

  • 这就是Yii所做的,而且效果很好.它们还具有"验证方案",因此您可以针对不同的方案使用不同的验证规则,例如create vs update (4认同)

Abi*_*usX 31

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

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

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

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

您可以使用正则表达式进行大多数验证,它在PHP和JS上具有相同的语法(几乎).

  • 我被教导要尽可能地使控制器变亮.在我看来,验证是业务逻辑的一部分...... (16认同)
  • MVC中的控制器是表示层的一部分.他们不应该对如何执行数据验证有任何线索,这是模型层的责任. (4认同)
  • 控制器应该轻巧,但由于验证是强制性的,因此不能跳过。减轻控制器的负担意味着不要在其中添加任何逻辑或视图。 (2认同)
  • 不像那样。您的意思是用户界面应该不能告诉用户是否输入了姓名而不是数字?它与应用程序的业务逻辑无关。这更多的是演示问题。电子邮件输入是一个演示问题,而不是业务逻辑问题(也可以在此处重新检查) (2认同)