假设我设计了这样的架构 - 应用程序由模块组成,模块使用特定于域的实用程序来执行对模型或数据库的更改。
一个例子,一个注册模块,它显示表单,接受输入,然后使用注册实用程序,它将执行调用以插入用户信息。谁负责执行数据验证?
1)模块,因为它是“优越”将数据传递给实用程序 2)实用程序,这样没有可疑的数据将通过 3)两者都应该有彻底的数据验证 4)其他一些安排
思考?意见?
答案 0 :(得分:5)
任何使用数据的组件都负责根据自己的目的验证数据。
例如:服务层的某些部分可能会验证输入字段是否为有效的电子邮件地址,因为这是业务规则所要求的。虽然数据层可以验证数据不长于特定长度,因为这是数据库列中可以容纳的最大数据,但它并不特别关心它是否是电子邮件地址。
它也应该在允许重复使用的位置。因此(在MVC中)上面的“有效电子邮件”验证不会进入控制器或视图,因为输入到该业务逻辑可能会在多个控制器/视图中发生,这将需要重复验证逻辑。
答案 1 :(得分:0)
验证应尽可能接近模型。由于该实用程序更改了模型,因此它不应该信任数据模块发送它的有效性。这样,重用该实用程序会更安全(您可以在多个模块中使用它而无需复制验证代码)。
另一方面,将验证放在模块上 - 更靠近用户可以提供更好的体验(更快 - 客户端验证等)。 因此,在我看来,最好的方法是将验证放在您的实用程序中,以后,如果您有资源通过在模块中添加另一层验证来增强用户体验。
答案 2 :(得分:0)
应尽快验证数据 - 即,从输入(例如用户输入)读取数据与验证数据之间应存在最小距离。实际的原因是它可以更容易地查看验证码。
在MVC中,我会说它应该进入'控制器',假设控制器是你读取所有输入值的位置(控制器然后将验证的值传递给模型,当你这样做时)
也就是说,您的验证代码中可能会有很多可以共享的内容,您可以编写自己的帮助代码进行验证。
答案 3 :(得分:0)
验证的位置取决于应用程序内部的API暴露以及设计中应进行验证的位置(即谁拥有验证问题)。
为了设置有效的电子邮件地址,接受数据的控制器可能应该这样做,因为所有其他代码都期望看起来有效的电子邮件地址。另一方面,验证数据被正确转义以进行数据库处理属于模型内部的深处,就在实际的SQL处理之上。