¿Cómo compartir la validación entre formularios y objetos de valor en el diseño impulsado por dominio?
# 1 Validar dirección de correo electrónico en el formulario
Tengo una clase de formulario de fondo con unemailAddress
propiedad que tiene lógica de validación para que pueda devolver un mensaje de error al usuario. Valido todas las entradas de formulario con 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 objeto de valor de dirección de correo electrónico en el controlador de comandos
Tengo un controlador de comandos que tomará el correo electrónico de cadena primitivo y creará un objeto de valor. El objeto de valor arrojará una excepción en la creación si el correo electrónico no es vá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;
}
En el n. ° 1, quiero capturar la validación antes de enviar un comando. Pero luego, en el n. ° 2, esa lógica de validación se repite cuando construyo VO.
Problemas que tengo:
Si necesito cambiar los requisitos de validación en las direcciones de correo electrónico, tengo que actualizar ambos lugares.Si uso VO en mi formulario, entonces tendré que deconstruirlos nuevamente al pasar al comando. Además, si mi formulario está en un contexto limitado diferente, entonces tendré VOs que pierden dominio del otro contexto limitado (¿tal vez esto es necesario?).Entonces mi pregunta es, ¿debería crear algunavalidador ¿Qué objetos pueden compartir / utilizar tanto mi validación de formulario como mis VO? ¿O cómo capturo las preocupaciones de validación repetidas entre formularios y objetos de valor?