#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. 在Command Handler中验证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,则在传递给命令时必须再次解构它们。此外,如果我的表单位于不同的Bounded Context中,则VO将泄漏来自其他Bounded Context的域(也许这是必要的?)。
因此,我的问题是,我应该创建一些验证器对象,使我的表单验证和VO可以共享/利用吗?或者如何捕获表单和值对象之间重复的验证问题?