Web应用程序的表单验证 - 设计将域错误传播到客户端?

Vla*_*sny 10 architecture validation domain-driven-design

数据验证应在Web应用程序的以下位置进行:

  • 客户端:浏览器.加快用户错误报告
  • 服务器端:控制器.检查用户输入是否在语法上有效(没有sql注入,例如,所有传入字段的有效格式,所有必填字段都填写等)
  • 服务器端:模型(域层).检查用户输入是否在域中有效(没有重复的用户名,帐户余额不是负数等)

我目前是DDD粉丝,所以我在我的应用程序中分离了UI和Domain层.

我也试图遵循这个规则,域模型永远不应该包含无效数据.

那么,如何在应用程序中设计验证机制,以便在域中发生的验证错误正确传播到客户端?例如,当域模型引发有关重复用户名的异常时,如何将该异常正确绑定到提交的表单?

一些启发了这个问题的文章可以在这里找到:http://verraes.net/2015/02/form-command-model-validation/

我在Web框架中看不到这样的机制.首先想到的是让域模型包含字段的名称,导致异常,在异常数据中,然后在UI层中提供表单数据字段和模型数据字段之间的映射,以在其上下文中正确显示错误对于用户.这种方法有效吗?它看起来很不稳定......有一些更好的设计的例子吗?

the*_*Dmi 5

虽然与这个问题不完全相同,但我认为答案是一样的:

将验证逻辑封装到可重用的类中.这些类通常称为规范,验证器或规则,并且是域的一部分.

现在,您可以在模型和服务层中使用这些规范.

如果您的UI使用与模型相同的技术,您也可以在那里使用规范(例如,在服务器上使用NodeJS时,您可以在JS中编写规范并在浏览器中使用它们).

编辑 - 聊天后的其他信息

  • 创建细粒度的规范,以便在规范失败时能够显示相应的错误消息.
  • 不要使业务规则或规范知道表单字段.
  • 仅为业务规则创建规范,而不是为基本输入验证任务创建规范(例如,检查null).