哪个“层”负责验证数据

时间:2009-07-29 06:18:13

标签: php validation

假设我设计了这样的架构 - 应用程序由模块组成,模块使用特定于域的实用程序来执行对模型或数据库的更改。

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

1)模块,因为它是“优越”将数据传递给实用程序 2)实用程序,这样没有可疑的数据将通过 3)两者都应该有彻底的数据验证 4)其他一些安排

思考?意见?

4 个答案:

答案 0 :(得分:5)

任何使用数据的组件都负责根据自己的目的验证数据。

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

应尽快验证数据 - 即,从输入(例如用户输入)读取数据与验证数据之间应存在最小距离。实际的原因是它可以更容易地查看验证码。

在MVC中,我会说它应该进入'控制器',假设控制器是你读取所有输入值的位置(控制器然后将验证的值传递给模型,当你这样做时)

也就是说,您的验证代码中可能会有很多可以共享的内容,您可以编写自己的帮助代码进行验证。

答案 3 :(得分:0)

验证的位置取决于应用程序内部的API暴露以及设计中应进行验证的位置(即谁拥有验证问题)。

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