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?

questionAnswers(1)

yourAnswerToTheQuestion