Как разделить валидацию между формами и объектами значений в управляемом доменом дизайне?

# 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? Или как мне зафиксировать повторяющиеся проблемы проверки между формами и объектами значений?

Ответы на вопрос(1)

Ваш ответ на вопрос