Como compartilhar a validação entre Formulários e Objetos de Valor no Design Orientado a Domínio?
# 1 Validar EmailAddress no formulário
Eu tenho uma classe de formulário de back-end com umemailAddress
propriedade que possui lógica de validação para que eu possa retornar uma mensagem de erro ao usuário. Valido todas as entradas de formulário com algo como:
$form->fillWith($request->input());
if($form->validate()){
$form->dispatch($command); // if synchronous, form takes command's messageBag
}
return response($form->getMessageBag()->toJson());
# 2 Validar o objeto de valor EmailAddress no manipulador de comandos
Eu tenho um manipulador de comando que pegará o email da string primitiva e criará um objeto de valor. O objeto de valor lançará uma exceção na criação se o email for inválido:
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;
}
No nº 1, quero capturar a validação antes de enviar um comando. Mas então, na segunda posição, essa lógica de validação é repetida quando eu construo VOs.
Problemas que tenho:
Se eu precisar alterar os requisitos de validação nos endereços de e-mail, preciso atualizar os dois locais.Se eu usar VOs no meu formulário, terei que desconstruí-los novamente ao passar para o comando. Além disso, se meu formulário estiver em um contexto limitado limitado, terei domínio de vazamento de VOs do outro contexto limitado (talvez isso seja necessário?).Então, minha pergunta é: devo criar algunsvalidador objetos que minha validação de formulário e VOs podem compartilhar / utilizar? Ou como capturar preocupações repetidas de validação entre formulários e objetos de valor?