Magento 2 Experten — Hyvä Theme, Tailwind CSS & SEO aus einer Hand ›

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.