Wie kann ich die Validierung zwischen Formularen und Wertobjekten im domänengetriebenen Design teilen?

# 1. Validiere EmailAddress auf dem Formular

Ich habe eine Backend-Formularklasse mit einememailAddress -Eigenschaft mit Überprüfungslogik, sodass ich eine Fehlermeldung an den Benutzer zurückgeben kann. Ich überprüfe alle Formulareingaben mit etwas wie:

$form->fillWith($request->input());

if($form->validate()){
    $form->dispatch($command); // if synchronous, form takes command's messageBag
}

return response($form->getMessageBag()->toJson());

# 2. Validieren Sie das EmailAddress-Wertobjekt im Command Handler

Ich habe einen Befehlshandler, der die E-Mail mit der primitiven Zeichenfolge verwendet und ein Wertobjekt erstellt. Das Wertobjekt löst bei der Erstellung eine Ausnahme aus, wenn die E-Mail ungültig ist:

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;
}

In # 1 möchte ich die Validierung frühzeitig erfassen, bevor ich einen Befehl absende. Aber dann wird in # 2 diese Validierungslogik wiederholt, wenn ich VOs erstelle.

Issues Ich habe:

Wenn ich die Überprüfungsanforderungen für E-Mail-Adressen ändern muss, muss ich beide Bereiche aktualisieren.Wenn ich VOs in meinem Formular verwende, muss ich sie bei der Übergabe an den Befehl erneut dekonstruieren. Befindet sich mein Formular in einem anderen begrenzten Kontext, treten bei mir VOs auf, die von dem anderen begrenzten Kontext abweichen (möglicherweise ist dies erforderlich?).

Also meine Frage ist, sollte ich einige erstellen validator Objekte, die sowohl meine Formularvalidierung als auch meine VOs gemeinsam nutzen können? Oder wie erfasse ich wiederholte Validierungsprobleme zwischen Formularen und Wertobjekten?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage