gpt4 book ai didi

forms - 如何在领域驱动设计中的表单和值对象之间共享验证?

转载 作者:行者123 更新时间:2023-12-01 16:50:47 25 4
gpt4 key购买 nike

#1。验证表单上的电子邮件地址

我有一个带有 emailAddress 属性的后端表单类,该属性具有验证逻辑,以便我可以将错误消息返回给用户。我使用以下内容验证所有表单输入:

$form->fillWith($request->input());

if($form->validate()){
$form->dispatch($command); // if synchronous, form takes command's messageBag
}

return response($form->getMessageBag()->toJson());

#2。在命令处理程序中验证 EmailAddress 值对象

我有一个命令处理程序,它将获取原始字符串电子邮件并创建一个值对象。如果电子邮件无效,值对象将在创建时抛出异常:

public function handle($command){

try {
$emailAddress = new ValueObjects\EmailAddress($command->emailAddress);

// create more value objects...

// do something else with the domain...

} catch (DomainException $e) {
$this->messageBag->add("errors", $e->getMessage());
} catch (\Exception $e) {
$this->messageBag->add("errors", "unexpected error");
}

return $this->messageBag;
}

在#1中,我想在发送命令之前尽早捕获验证。但在#2 中,当我构建 VO 时,会重复验证逻辑。

我遇到的问题:

  • 如果我需要更改电子邮件地址的验证要求,那么我必须更新这两个位置。
  • 如果我在表单上使用 VO,那么在传递给命令时我将不得不再次解构它们。另外,如果我的表单位于不同的有界上下文中,那么我的 VO 将会从其他有界上下文中泄漏域(也许这是必要的?)。

所以我的问题是,我应该创建一些表单验证和 VO 都可以共享/利用的验证器对象吗?或者如何捕获表单和值对象之间的重复验证问题?

最佳答案

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

有多种方法可以做到这一点,这是我使用的一种方法:

  1. 定义一个提供 bool IsSatisifed() 方法的接口(interface)规范
  2. 为特定值对象实现此接口(interface),例如EmailWellformedSpec
  3. 使用规范作为前提条件在域内强制执行业务规则(即违规始终是编程错误)。
  4. 在服务层中使用输入验证规范(即违规是用户错误)。

如果您想将多个规范组合成一个更大的规范,则 Specification Pattern是一个好方法。请注意,如果使用该模式,则需要通过构造函数传入数据,但这不是问题,因为规范类通常很简单。

关于forms - 如何在领域驱动设计中的表单和值对象之间共享验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33220394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com