【问题标题】:Validation layer in PHP and DB interactionPHP 和 DB 交互中的验证层
【发布时间】:2015-08-01 06:52:06
【问题描述】:

在我的应用程序输入中,我有以下数据:airplane_idairport_idpassenger(s) 详细信息。

我需要确保所选的 airplane_id 可以到达 airport_id。它可能只在 SQL 查询的帮助下完成,但这种检查仍然是一个验证过程,不是吗?

验证应该在我保存乘客详细信息之前进行。

在我的应用程序模型中,它是表示表格的 ActiveRecord 模式对象。我宁愿将 Validator 作为一个单独的层,也不愿将其构建到 Model 层中。但在这种情况下,我有一个额外的问题:通常验证器是通用的(它们的规则可能适用于任何数据集)。例如,这是数据电子邮件吗?还是IP?或日期?等等......但不要介意数据是什么。 就我而言,上述规则根本不常见。它肯定是一个特定的规则,不能被任何其他输入数据使用。所以我的问题是:这种检查仍然是验证过程的一部分吗? 如果是,Validator 是否会违反SOLID 集合中的S 原则?

【问题讨论】:

  • 我怀疑它是否会违反任何重要的内容。与在创建新用户之前检查用户名是否唯一没有太大区别。不妨看看 Symfony 验证组件是如何组织事物的:symfony.com/doc/master/book/validation.html
  • @Cerad 你知道如何在 Symfony Validator 的帮助下组织验证吗?
  • 首先阅读文档:github.com/symfony/Validator
  • @Cerad 您可能没有阅读我原来的问题。 Symfony 验证器不允许您发出 db 请求来验证复杂数据。例如对于电子商务:验证篮子总和是更少还是更多定义的金额?并且每个类别的定义金额不同,意味着从类别 A 中您最多只能选择 10 美元,从类别 B 中选择 8 美元等。所有这些限制都存储在数据库中,您知道如何在 Symfony 验证器的帮助下实现这种情况?
  • 很确定我读过这个问题。是的,Symfony 验证器确实可以访问数据库。或许可以看一下手册?

标签: php validation model-view-controller domain-driven-design solid-principles


【解决方案1】:

这是验证,您应该使用单独的验证层(输入验证的单一职责)。输入验证不仅仅是数据类型检查,它可能要复杂得多。不过可能仍需要模型验证。

将输入验证视为白名单验证(“接受已知良好”),将模型验证视为黑名单验证(“拒绝已知不良”)。白名单验证更安全,而黑名单验证可防止您的模型层过度受限于非常具体的用例。

无效的模型数据应该总是导致抛出异常(否则应用程序可以继续运行而不会注意到错误),而来自外部来源的无效输入值并不意外,而是很常见(除非您的用户从不犯错误)。

另请参阅:https://lastzero.net/2015/11/form-validation-vs-model-validation/

【讨论】:

  • 谢谢老兄。这正是我几个月前所做的。
【解决方案2】:

是的,这些检查是验证。

根据 MVC 模式框架 (Yii/2) 的经验,我想说您可以创建一个抽象验证器类,然后将其扩展到您的具体验证器并从模型类中调用这些验证器。这将需要一个Model->validate() 调用,但是有单独的类来实际检查数据不会违反SOLID 中的S,而Model->validate() 将只是循环通过验证器验证方法并将错误消息存储在一个数组中.

【讨论】:

  • 您是说验证者询问模型不违规的情况?我认为当模型自我验证时,它已经违反了:) 但我理解你的观点,谢谢。
猜你喜欢
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 2023-02-15
  • 1970-01-01
  • 2012-03-18
  • 2013-06-16
  • 1970-01-01
相关资源
最近更新 更多