Php 其中';层';负责数据的验证

Php 其中';层';负责数据的验证,php,validation,Php,Validation,假设我设计了一个这样的体系结构——应用程序由模块组成,模块使用特定于领域的实用程序来执行对模型或数据库的更改 例如,一个显示表单的注册模块,接受输入,然后使用注册实用程序,该实用程序将执行调用以插入数据库中的用户信息。谁负责执行数据验证 1) 模块,因为它是将数据向下传递给实用程序的“上级” 2) 实用程序,这样就不会有可疑数据通过 3) 两者都应该进行彻底的数据验证 4) 其他一些安排 想法?意见?验证应尽可能接近模型。由于实用程序更改了模型,因此它不应信任发送它的数据模块的有效性。这样可以更

假设我设计了一个这样的体系结构——应用程序由模块组成,模块使用特定于领域的实用程序来执行对模型或数据库的更改

例如,一个显示表单的注册模块,接受输入,然后使用注册实用程序,该实用程序将执行调用以插入数据库中的用户信息。谁负责执行数据验证

1) 模块,因为它是将数据向下传递给实用程序的“上级” 2) 实用程序,这样就不会有可疑数据通过 3) 两者都应该进行彻底的数据验证 4) 其他一些安排


想法?意见?

验证应尽可能接近模型。由于实用程序更改了模型,因此它不应信任发送它的数据模块的有效性。这样可以更安全地重用该实用程序(您可以在多个模块中使用它,而无需复制验证代码)

另一方面,将验证放在离用户更近的模块上可以提供更好的体验(更快的客户端验证等)。
所以,在我看来,最好的方法是将验证放在您的实用程序中,然后,如果您有资源,可以通过在模块中添加另一层验证来增强用户体验

验证应尽可能接近模型。由于实用程序更改了模型,因此它不应信任发送它的数据模块的有效性。这样可以更安全地重用该实用程序(您可以在多个模块中使用它,而无需复制验证代码)

另一方面,将验证放在离用户更近的模块上可以提供更好的体验(更快的客户端验证等)。
所以,在我看来,最好的方法是将验证放在您的实用程序中,然后,如果您有资源,可以通过在模块中添加另一层验证来增强用户体验

应尽快验证数据-即,从输入(如用户输入)读取数据与验证数据之间应有最小距离。这样做的实际原因是,这样可以更容易地检查验证代码

在MVC中,我认为它应该进入“控制器”,假设控制器是您读取所有输入值的地方(当您这样做时,控制器然后将验证值传递给模型)


这就是说,您的验证代码中可能有相当多的内容可以共享,您可以自己编写帮助程序代码进行验证。

应该尽快验证数据-即,从输入读取数据(如用户输入)和验证数据之间应该有最小的距离。这样做的实际原因是,这样可以更容易地检查验证代码

在MVC中,我认为它应该进入“控制器”,假设控制器是您读取所有输入值的地方(当您这样做时,控制器然后将验证值传递给模型)


这就是说,您的验证代码中可能有相当多的内容可以共享,您可以自己编写帮助程序代码进行验证。

任何使用数据的组件都有责任为自己的目的验证数据

例如:服务层的某些部分可能会验证输入字段是否是有效的电子邮件地址,因为这是业务规则规定的。虽然数据层可能会验证数据长度是否不超过特定长度,因为这是数据库列中可以容纳的最大长度,但它并不特别关心是否是电子邮件地址


它还应位于允许重复使用的位置。因此(在MVC中),来自上面的“有效电子邮件”验证不会进入控制器或视图,因为对该业务逻辑的输入可能发生在多个控制器/视图中,这需要重复验证逻辑。

任何使用数据的组件都负责为其自身目的验证数据

例如:服务层的某些部分可能会验证输入字段是否是有效的电子邮件地址,因为这是业务规则规定的。虽然数据层可能会验证数据长度是否不超过特定长度,因为这是数据库列中可以容纳的最大长度,但它并不特别关心是否是电子邮件地址


它还应位于允许重复使用的位置。因此(在MVC中),来自上面的“有效电子邮件”验证不会进入控制器或视图,因为对该业务逻辑的输入可能发生在多个控制器/视图中,这将需要重复验证逻辑。

验证的位置取决于应用程序中的API暴露以及验证应在设计中的何处进行(即谁拥有验证关注点)


为了设置有效的电子邮件地址,接受数据的控制器可能应该这样做,因为所有其他代码都需要一个看起来有效的电子邮件地址。另一方面,验证数据是否正确转义以进行数据库处理属于模型的深层,就在实际的SQL处理之上

验证的地点取决于应用程序内部的API暴露情况以及在设计中应在何处进行验证(即谁拥有验证关注点)

为了设置有效的电子邮件地址,接受数据的控制器可能应该这样做,因为所有其他代码都需要一个看起来有效的电子邮件地址。另一方面,验证数据是否正确转义以进行数据库处理属于模型的深层,就在实际的SQL处理之上