- Add DISCOVERY_LOG_LEVEL=debug - Add DISCOVERY_SHOW_PROGRESS=true - Temporary changes for debugging InitializerProcessor fixes on production
452 lines
12 KiB
Markdown
452 lines
12 KiB
Markdown
# Validierungsregeln
|
|
|
|
> **Dokumentationshinweis:** Diese Dokumentation ist vollständig aktualisiert und stellt die aktuelle Implementierung der Validierungsregeln korrekt dar.
|
|
|
|
## Übersicht
|
|
|
|
Das Validation Framework bietet eine umfangreiche Sammlung vordefinierter Validierungsregeln, die als PHP-Attribute verwendet werden können. Diese Regeln können auf Objekteigenschaften angewendet werden, um Daten zu validieren und sicherzustellen, dass sie den erwarteten Anforderungen entsprechen.
|
|
|
|
## Grundlegende Regeln
|
|
|
|
### Required
|
|
|
|
Die `Required`-Regel stellt sicher, dass ein Wert vorhanden ist und nicht leer ist:
|
|
|
|
```php
|
|
use App\Framework\Validation\Rules\Required;
|
|
|
|
class UserData
|
|
{
|
|
#[Required]
|
|
public string $username;
|
|
|
|
#[Required(message: "Die E-Mail-Adresse ist erforderlich.")]
|
|
public string $email;
|
|
}
|
|
```
|
|
|
|
**Parameter:**
|
|
- `message` (optional): Benutzerdefinierte Fehlermeldung
|
|
- `groups` (optional): Array von Validierungsgruppen, zu denen diese Regel gehört
|
|
|
|
**Validierungslogik:**
|
|
- Gibt `false` zurück, wenn der Wert `null` oder ein leerer String ist
|
|
- Gibt `true` zurück für alle anderen Werte, einschließlich `0` und `false`
|
|
|
|
### Email
|
|
|
|
Die `Email`-Regel validiert, dass ein Wert eine gültige E-Mail-Adresse ist:
|
|
|
|
```php
|
|
use App\Framework\Validation\Rules\Email;
|
|
|
|
class UserData
|
|
{
|
|
#[Email]
|
|
public string $email;
|
|
|
|
#[Email(message: "Bitte geben Sie eine gültige E-Mail-Adresse ein.")]
|
|
public string $alternativeEmail;
|
|
}
|
|
```
|
|
|
|
**Parameter:**
|
|
- `message` (optional): Benutzerdefinierte Fehlermeldung
|
|
|
|
**Validierungslogik:**
|
|
- Verwendet `filter_var()` mit `FILTER_VALIDATE_EMAIL` zur Validierung
|
|
- Leere Werte werden als gültig betrachtet (verwenden Sie `Required` in Kombination, um leere Werte zu verhindern)
|
|
|
|
### StringLength
|
|
|
|
Die `StringLength`-Regel validiert die Länge eines Strings:
|
|
|
|
```php
|
|
use App\Framework\Validation\Rules\StringLength;
|
|
|
|
class UserData
|
|
{
|
|
#[StringLength(min: 3, max: 50)]
|
|
public string $username;
|
|
|
|
#[StringLength(min: 8, message: "Das Passwort muss mindestens 8 Zeichen lang sein.")]
|
|
public string $password;
|
|
|
|
#[StringLength(max: 500)]
|
|
public ?string $bio;
|
|
}
|
|
```
|
|
|
|
**Parameter:**
|
|
- `min` (optional): Minimale Länge des Strings
|
|
- `max` (optional): Maximale Länge des Strings
|
|
- `message` (optional): Benutzerdefinierte Fehlermeldung
|
|
|
|
**Validierungslogik:**
|
|
- Mindestens einer der Parameter `min` oder `max` muss gesetzt sein
|
|
- Verwendet `mb_strlen()` für korrekte Behandlung von Multibyte-Zeichen
|
|
- Leere Werte werden als gültig betrachtet (verwenden Sie `Required` in Kombination, um leere Werte zu verhindern)
|
|
|
|
### Url
|
|
|
|
Die `Url`-Regel validiert, dass ein Wert eine gültige URL ist:
|
|
|
|
```php
|
|
use App\Framework\Validation\Rules\Url;
|
|
|
|
class UserData
|
|
{
|
|
#[Url]
|
|
public string $website;
|
|
|
|
#[Url(message: "Bitte geben Sie eine gültige URL ein.")]
|
|
public string $profileUrl;
|
|
}
|
|
```
|
|
|
|
**Parameter:**
|
|
- `message` (optional): Benutzerdefinierte Fehlermeldung
|
|
|
|
**Validierungslogik:**
|
|
- Verwendet `filter_var()` mit `FILTER_VALIDATE_URL` zur Validierung
|
|
- Leere Werte werden als gültig betrachtet (verwenden Sie `Required` in Kombination, um leere Werte zu verhindern)
|
|
|
|
### Numeric
|
|
|
|
Die `Numeric`-Regel validiert, dass ein Wert numerisch ist:
|
|
|
|
```php
|
|
use App\Framework\Validation\Rules\Numeric;
|
|
|
|
class ProductData
|
|
{
|
|
#[Numeric]
|
|
public $price;
|
|
|
|
#[Numeric(message: "Die Menge muss eine Zahl sein.")]
|
|
public $quantity;
|
|
}
|
|
```
|
|
|
|
**Parameter:**
|
|
- `message` (optional): Benutzerdefinierte Fehlermeldung
|
|
|
|
**Validierungslogik:**
|
|
- Verwendet `is_numeric()` zur Validierung
|
|
- Leere Werte werden als gültig betrachtet (verwenden Sie `Required` in Kombination, um leere Werte zu verhindern)
|
|
|
|
## Erweiterte Regeln
|
|
|
|
### Pattern
|
|
|
|
Die `Pattern`-Regel validiert einen Wert gegen einen regulären Ausdruck:
|
|
|
|
```php
|
|
use App\Framework\Validation\Rules\Pattern;
|
|
|
|
class UserData
|
|
{
|
|
#[Pattern(pattern: '/^[a-zA-Z0-9_]+$/', message: "Der Benutzername darf nur Buchstaben, Zahlen und Unterstriche enthalten.")]
|
|
public string $username;
|
|
}
|
|
```
|
|
|
|
**Parameter:**
|
|
- `pattern`: Regulärer Ausdruck für die Validierung
|
|
- `message` (optional): Benutzerdefinierte Fehlermeldung
|
|
|
|
**Validierungslogik:**
|
|
- Verwendet `preg_match()` zur Validierung gegen den angegebenen regulären Ausdruck
|
|
- Leere Werte werden als gültig betrachtet (verwenden Sie `Required` in Kombination, um leere Werte zu verhindern)
|
|
|
|
### Range
|
|
|
|
Die `Range`-Regel validiert, dass ein numerischer Wert innerhalb eines bestimmten Bereichs liegt:
|
|
|
|
```php
|
|
use App\Framework\Validation\Rules\Range;
|
|
|
|
class ProductData
|
|
{
|
|
#[Range(min: 0)]
|
|
public float $price;
|
|
|
|
#[Range(min: 1, max: 100, message: "Die Menge muss zwischen 1 und 100 liegen.")]
|
|
public int $quantity;
|
|
}
|
|
```
|
|
|
|
**Parameter:**
|
|
- `min` (optional): Minimaler Wert
|
|
- `max` (optional): Maximaler Wert
|
|
- `message` (optional): Benutzerdefinierte Fehlermeldung
|
|
|
|
**Validierungslogik:**
|
|
- Mindestens einer der Parameter `min` oder `max` muss gesetzt sein
|
|
- Leere Werte werden als gültig betrachtet (verwenden Sie `Required` in Kombination, um leere Werte zu verhindern)
|
|
|
|
### In
|
|
|
|
Die `In`-Regel validiert, dass ein Wert in einer Liste gültiger Werte enthalten ist:
|
|
|
|
```php
|
|
use App\Framework\Validation\Rules\In;
|
|
|
|
class ProductData
|
|
{
|
|
#[In(values: ['small', 'medium', 'large'])]
|
|
public string $size;
|
|
|
|
#[In(values: [1, 2, 3, 4, 5], message: "Bitte wählen Sie eine gültige Kategorie.")]
|
|
public int $category;
|
|
}
|
|
```
|
|
|
|
**Parameter:**
|
|
- `values`: Array gültiger Werte
|
|
- `message` (optional): Benutzerdefinierte Fehlermeldung
|
|
|
|
**Validierungslogik:**
|
|
- Verwendet `in_array()` zur Validierung
|
|
- Leere Werte werden als gültig betrachtet (verwenden Sie `Required` in Kombination, um leere Werte zu verhindern)
|
|
|
|
### DateFormat
|
|
|
|
Die `DateFormat`-Regel validiert, dass ein Wert ein gültiges Datum in einem bestimmten Format ist:
|
|
|
|
```php
|
|
use App\Framework\Validation\Rules\DateFormat;
|
|
|
|
class EventData
|
|
{
|
|
#[DateFormat(format: 'Y-m-d')]
|
|
public string $date;
|
|
|
|
#[DateFormat(format: 'Y-m-d H:i:s', message: "Bitte geben Sie ein gültiges Datum und eine gültige Uhrzeit ein.")]
|
|
public string $datetime;
|
|
}
|
|
```
|
|
|
|
**Parameter:**
|
|
- `format`: Das erwartete Datumsformat (PHP date()-Format)
|
|
- `message` (optional): Benutzerdefinierte Fehlermeldung
|
|
|
|
**Validierungslogik:**
|
|
- Verwendet `DateTime::createFromFormat()` zur Validierung
|
|
- Leere Werte werden als gültig betrachtet (verwenden Sie `Required` in Kombination, um leere Werte zu verhindern)
|
|
|
|
### Phone
|
|
|
|
Die `Phone`-Regel validiert, dass ein Wert eine gültige Telefonnummer ist:
|
|
|
|
```php
|
|
use App\Framework\Validation\Rules\Phone;
|
|
|
|
class ContactData
|
|
{
|
|
#[Phone]
|
|
public string $phoneNumber;
|
|
|
|
#[Phone(message: "Bitte geben Sie eine gültige Telefonnummer ein.")]
|
|
public string $mobileNumber;
|
|
}
|
|
```
|
|
|
|
**Parameter:**
|
|
- `message` (optional): Benutzerdefinierte Fehlermeldung
|
|
|
|
**Validierungslogik:**
|
|
- Validiert Telefonnummern mit einem flexiblen Muster, das verschiedene Formate unterstützt
|
|
- Leere Werte werden als gültig betrachtet (verwenden Sie `Required` in Kombination, um leere Werte zu verhindern)
|
|
|
|
### Ulid
|
|
|
|
Die `Ulid`-Regel validiert, dass ein Wert ein gültiger ULID (Universally Unique Lexicographically Sortable Identifier) ist:
|
|
|
|
```php
|
|
use App\Framework\Validation\Rules\Ulid;
|
|
|
|
class EntityData
|
|
{
|
|
#[Ulid]
|
|
public string $id;
|
|
|
|
#[Ulid(message: "Die ID muss ein gültiger ULID sein.")]
|
|
public string $parentId;
|
|
}
|
|
```
|
|
|
|
**Parameter:**
|
|
- `message` (optional): Benutzerdefinierte Fehlermeldung
|
|
|
|
**Validierungslogik:**
|
|
- Validiert, dass der Wert ein gültiger ULID ist (26 Zeichen, Base32-Kodierung)
|
|
- Leere Werte werden als gültig betrachtet (verwenden Sie `Required` in Kombination, um leere Werte zu verhindern)
|
|
|
|
### IsTrue
|
|
|
|
Die `IsTrue`-Regel validiert, dass ein Wert `true` ist:
|
|
|
|
```php
|
|
use App\Framework\Validation\Rules\IsTrue;
|
|
|
|
class RegistrationData
|
|
{
|
|
#[IsTrue(message: "Sie müssen die Nutzungsbedingungen akzeptieren.")]
|
|
public bool $termsAccepted;
|
|
}
|
|
```
|
|
|
|
**Parameter:**
|
|
- `message` (optional): Benutzerdefinierte Fehlermeldung
|
|
|
|
**Validierungslogik:**
|
|
- Gibt `true` zurück, wenn der Wert `true` ist
|
|
- Gibt `false` zurück für alle anderen Werte
|
|
- Leere Werte werden als ungültig betrachtet
|
|
|
|
## Benutzerdefinierte Regeln
|
|
|
|
### Custom
|
|
|
|
Die `Custom`-Regel ermöglicht die Definition einer benutzerdefinierten Validierungslogik mit einer Callback-Funktion:
|
|
|
|
```php
|
|
use App\Framework\Validation\Rules\Custom;
|
|
|
|
class UserData
|
|
{
|
|
#[Custom(callback: 'validateUsername', message: "Der Benutzername ist ungültig.")]
|
|
public string $username;
|
|
|
|
private function validateUsername($value): bool
|
|
{
|
|
// Benutzerdefinierte Validierungslogik
|
|
return preg_match('/^[a-zA-Z0-9_]{3,20}$/', $value) === 1;
|
|
}
|
|
}
|
|
```
|
|
|
|
**Parameter:**
|
|
- `callback`: Name der Callback-Methode oder Closure
|
|
- `message` (optional): Benutzerdefinierte Fehlermeldung
|
|
|
|
**Validierungslogik:**
|
|
- Ruft die angegebene Callback-Funktion auf und gibt deren Rückgabewert zurück
|
|
- Leere Werte werden an die Callback-Funktion übergeben
|
|
|
|
## Eigene Validierungsregeln erstellen
|
|
|
|
Sie können eigene Validierungsregeln erstellen, indem Sie das `ValidationRule`-Interface implementieren:
|
|
|
|
```php
|
|
use App\Framework\Validation\ValidationRule;
|
|
use Attribute;
|
|
|
|
#[Attribute(Attribute::TARGET_PROPERTY)]
|
|
final readonly class Password implements ValidationRule
|
|
{
|
|
public function __construct(
|
|
private int $minLength = 8,
|
|
private bool $requireSpecialChars = true,
|
|
private ?string $message = null
|
|
) {
|
|
}
|
|
|
|
public function validate(mixed $value): bool
|
|
{
|
|
if ($value === null || $value === '') {
|
|
return true; // Leere Werte werden von Required-Regel behandelt
|
|
}
|
|
|
|
if (!is_string($value) || strlen($value) < $this->minLength) {
|
|
return false;
|
|
}
|
|
|
|
if ($this->requireSpecialChars && !preg_match('/[^a-zA-Z0-9]/', $value)) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function getErrorMessages(): array
|
|
{
|
|
return [$this->message ?? "Das Passwort muss mindestens {$this->minLength} Zeichen lang sein und Sonderzeichen enthalten."];
|
|
}
|
|
}
|
|
```
|
|
|
|
## Validierungsgruppen
|
|
|
|
Für Regeln, die Validierungsgruppen unterstützen sollen, implementieren Sie das `GroupAware`-Interface:
|
|
|
|
```php
|
|
use App\Framework\Validation\ValidationRule;
|
|
use App\Framework\Validation\GroupAware;
|
|
use Attribute;
|
|
|
|
#[Attribute(Attribute::TARGET_PROPERTY)]
|
|
final readonly class Required implements ValidationRule, GroupAware
|
|
{
|
|
/**
|
|
* @param array<string> $groups Validierungsgruppen
|
|
*/
|
|
public function __construct(
|
|
private ?string $message = null,
|
|
private array $groups = []
|
|
) {
|
|
}
|
|
|
|
public function validate(mixed $value): bool
|
|
{
|
|
return $value !== null && $value !== '';
|
|
}
|
|
|
|
public function getErrorMessages(): array
|
|
{
|
|
return [$this->message ?? 'Dieser Wert ist erforderlich.'];
|
|
}
|
|
|
|
public function belongsToGroup(string $group): bool
|
|
{
|
|
return empty($this->groups) || in_array($group, $this->groups);
|
|
}
|
|
}
|
|
```
|
|
|
|
## Kombinieren von Regeln
|
|
|
|
Validierungsregeln können kombiniert werden, um komplexe Validierungsanforderungen zu erfüllen:
|
|
|
|
```php
|
|
class UserData
|
|
{
|
|
#[Required]
|
|
#[StringLength(min: 3, max: 50)]
|
|
#[Pattern(pattern: '/^[a-zA-Z0-9_]+$/')]
|
|
public string $username;
|
|
|
|
#[Required]
|
|
#[Email]
|
|
public string $email;
|
|
|
|
#[Required]
|
|
#[StringLength(min: 8)]
|
|
#[Custom(callback: 'validatePassword')]
|
|
public string $password;
|
|
|
|
private function validatePassword($value): bool
|
|
{
|
|
// Mindestens ein Großbuchstabe, ein Kleinbuchstabe, eine Zahl und ein Sonderzeichen
|
|
return preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^a-zA-Z\d]).+$/', $value) === 1;
|
|
}
|
|
}
|
|
```
|
|
|
|
## Weiterführende Informationen
|
|
|
|
- [Validation Framework Übersicht](index.md)
|
|
- [Beispiele für die Verwendung von Validierungsregeln](examples.md)
|
|
- [API-Validierung](/guides/api-validation.md)
|