PHP和DB交互中的验证层

PHP和DB交互中的验证层,php,validation,model-view-controller,domain-driven-design,solid-principles,Php,Validation,Model View Controller,Domain Driven Design,Solid Principles,在我的应用程序输入中,我有以下数据:飞机id、机场id和乘客详细信息 我需要确保选定的飞机id可以到达机场id。这可能只有在SQL查询的帮助下才能完成,但此检查仍然是一个验证过程,不是吗 验证应在我保存乘客详细信息之前进行 在我的应用程序模型中,表示表的是ActiveRecord模式对象。我宁愿将验证器作为一个独立的层,也不愿将其构建到模型层中。但在这种情况下,我有一个额外的问题:通常验证器是通用的(它们的规则可能应用于任何数据集)。例如,这是数据电子邮件吗?还是IP?还是约会?等但不管数据是什

在我的应用程序输入中,我有以下数据:飞机id、机场id和乘客详细信息

我需要确保选定的飞机id可以到达机场id。这可能只有在SQL查询的帮助下才能完成,但此检查仍然是一个验证过程,不是吗

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

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

是的,这些检查是验证


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

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

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

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


另请参见:

我怀疑它是否会违反任何重要规定。与创建新用户之前检查用户名是否唯一没有太大区别。也许可以看看Symfony验证组件是如何组织事情的:@Cerad您知道如何在我的案例中使用帮助Symfony Validator来组织验证吗?请从文档开始:@Cerad您可能没有阅读我的原始问题。Symfony validator不允许您发出db请求以验证复杂数据。例如,对于电子商务:验证篮子金额是否小于或大于定义的金额?每个类别的定义金额不同,这意味着从类别A中,您最多只能选择10美元,从类别B中选择8美元等。。所有这些限制都存储在DB中,您知道如何在Symfony validator的帮助下实现这种情况吗?我很确定我读过这个问题。是的,Symfony验证器确实可以访问数据库。也许浏览一下手册就可以了?你是说当验证器询问模型时,这种情况没有违反吗?我想当模型自我验证时,它已经违反了:)但我理解你的观点,谢谢你,伙计。这就是我几个月前所做的。