在我的应用程序输入中,我有以下数据: airplane_id , airport_id 和 passenger(s)详细信息。
我需要确保所选 airplane_id 可以到达 airport_id 。它可能只在帮助SQL查询时完成,但是这个检查仍然是一个验证过程,不是吗?
验证应该在我保存乘客详细信息之前进行。
在我的应用程序模型中,它是表示表的ActiveRecord模式对象。我宁愿将Validator作为一个分离层,而不是将其构建到 Model 层。但在这种情况下,我还有一个额外的问题:通常验证器是通用的(它们的规则可能适用于任何数据集)。比如这个数据电子邮件?还是IP?还是约会?等......但不要介意数据是什么。
就我而言,上述规则根本不常见;它肯定是一个特定的规则,任何其他输入数据都不能使用它。所以我的问题是:这个检查仍然是验证过程的一部分吗?
如果是的话,Validator是否会违反S
的{{1}}原则?
答案 0 :(得分:1)
这是验证,您应该使用单独的验证层(输入验证的单一责任)。输入验证不仅仅是数据类型检查,它可能要复杂得多。但仍可能需要进行模型验证。
将输入验证视为白名单验证(“接受已知商品”)并将模型验证视为黑名单验证(“拒绝已知错误”)。白名单验证更安全,而黑名单验证可防止您的模型层过度受限于非常具体的用例。
无效的模型数据应始终导致抛出异常(否则应用程序可以继续运行而不会注意到错误),而来自外部源的无效输入值不是意外的,而是常见的(除非您让用户永远不会犯错误) )。
另请参阅:https://lastzero.net/2015/11/form-validation-vs-model-validation/
答案 1 :(得分:0)
是的,这些检查是验证。
根据MVC模式框架(Yii / 2)的经验,我会说你可以创建一个抽象的验证器类,然后从那里扩展到你的具体验证器并从模型类中调用那些验证器。这需要进行Model->validate()
调用,但实际检查数据的单独类不会违反S
中的SOLID
,而Model->validate()
只会循环验证验证方法并将错误消息存储在数组中。