pro*_*mer 6 forms validation domain-driven-design value-objects
#1.验证表单上的EmailAddress
我有一个后端表单类,其emailAddress
属性具有验证逻辑,以便我可以将错误消息返回给用户.我使用类似的方式验证所有表单输入:
$form->fillWith($request->input());
if($form->validate()){
$form->dispatch($command); // if synchronous, form takes command's messageBag
}
return response($form->getMessageBag()->toJson());
Run Code Online (Sandbox Code Playgroud)
#2.在命令处理程序中验证EmailAddress值对象
我有一个命令处理程序,它将获取原始字符串电子邮件并创建一个值对象.如果电子邮件无效,则value对象将在创建时抛出异常:
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;
}
Run Code Online (Sandbox Code Playgroud)
在#1中,我希望在发送命令之前尽早捕获验证.但是在#2中,当我构建VO时,重复验证逻辑.
我遇到的问题:
所以我的问题是,我应该创建一些验证器对象,我的表单验证和VO可以共享/利用吗?或者如何捕获表单和值对象之间的重复验证问题?
将验证逻辑封装到可重用的类中.这些类通常称为规范,验证器或规则,并且是域的一部分.
有多种方法可以做到这一点,这是我使用的方法:
Specification
提供bool IsSatisifed()
方法的接口.EmailWellformedSpec
.如果要将多个规格组合成较大的规格,则规范模式是一种很好的方法.请注意,如果使用该模式,则需要通过构造函数传递数据,但这不是问题,因为规范类通常很简单.