Validierung im Formular: client- und serverseitig
Validierung im Formular: client- und serverseitig
~7 Min. Lesezeit Zuletzt aktualisiert am 9. August 2026
Ein UI-Components-Formular validiert standardmäßig nur im Browser - das ist Komfort für den Redakteur, aber kein Sicherheitsmechanismus. Wer die serverseitige Validierung im Save-Controller vergisst, öffnet die Tür für leere Pflichtfelder oder manipulierte Requests.
Clientseitige Validierung, deklarativ
Validierungsregeln werden über validation direkt an der jeweiligen Feld-Definition deklariert - keine eigene JavaScript-Zeile nötig:
<field name="title" formElement="input">
<settings>
<dataType>text</dataType>
<label translate="true">Title</label>
<validation>
<rule name="required-entry" xsi:type="boolean">true</rule>
<rule name="max_text_length" xsi:type="number">255</rule>
</validation>
</settings>
</field>Die verfügbaren Regelnamen (required-entry, validate-email, validate-number, max_text_length, min_text_length, validate-url, ...) stammen aus dem Magento-eigenen jQuery-Validation-Regelwerk, das UI Components im Hintergrund nutzt - dieselben Regelnamen, die man auch aus klassischen Luma-Formularen kennt.
Pflichtfelder visuell markieren
required-entry aktiviert automatisch sowohl die JS-Validierung als auch das rote Sternchen neben dem Label - ein separates Attribut dafür ist nicht nötig.
Serverseitige Validierung im Save-Controller
Die eigentliche Absicherung passiert serverseitig, im Save-Controller (Kapitel 12 zeigt den vollständigen Controller) - hier ein Ausschnitt der Validierung selbst:
/**
* Validates the posted announcement data.
*
* @param array<string, mixed> $data Raw POST data.
* @return void
* @throws LocalizedException
*/
private function validate(array $data): void
{
if (trim((string) ($data['title'] ?? '')) === '') {
throw new LocalizedException(__('Title is required.'));
}
if (mb_strlen((string) $data['title']) > 255) {
throw new LocalizedException(__('Title must not exceed 255 characters.'));
}
if (trim((string) ($data['message'] ?? '')) === '') {
throw new LocalizedException(__('Message is required.'));
}
}Achtung: assert() ist in diesem Projekt für Validierungslogik verboten - im Produktionsmodus kann assert() je nach zend.assertions-Einstellung stillschweigend deaktiviert sein, wodurch die Prüfung komplett wegfällt, ohne dass der Fehler sichtbar wird. Stattdessen gehören explizite if-Prüfungen mit LocalizedException in den Controller, so wie oben gezeigt.
Fehler dem Benutzer anzeigen
Fängt der Save-Controller die LocalizedException ab, wird die Fehlermeldung über $this->messageManager->addErrorMessage() angezeigt, und die zuletzt eingegebenen Werte bleiben über den DataPersistorInterface im Formular erhalten - Kapitel 12 zeigt diesen kompletten Ablauf im Save-Controller.
Tipp: Client- und serverseitige Validierung sollten dieselben Regeln ausdrücken, aber sie sind bewusst zwei getrennte Implementierungen: Die eine sorgt für gute Usability (sofortiges Feedback ohne Seiten-Reload), die andere für tatsächliche Datenintegrität. Eine der beiden zu überspringen, weil die andere "ja schon prüft", ist ein häufiger, aber vermeidbarer Fehler.