Как разделить валидацию между формами и объектами значений в управляемом доменом дизайне?
# 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. Проверьте значение объекта EmailAddress в обработчике команд
У меня есть обработчик команд, который будет принимать примитивную строку email и создавать объект значения. Объект значения будет генерировать исключение при создании, если адрес электронной почты недействителен:
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 в своей форме, мне придется снова деконструировать их при передаче в команду. Кроме того, если моя форма находится в другом ограниченном контексте, то у меня будет утечка доменов VO из другого ограниченного контекста (может быть, это необходимо?).Итак, мой вопрос, должен ли я создать некоторыевалидатор объекты, которые могут использовать / проверять моя форма проверки и VOs? Или как мне зафиксировать повторяющиеся проблемы проверки между формами и объектами значений?