Enable Discovery debug logging for production troubleshooting
- Add DISCOVERY_LOG_LEVEL=debug - Add DISCOVERY_SHOW_PROGRESS=true - Temporary changes for debugging InitializerProcessor fixes on production
This commit is contained in:
338
docs/components/validation/index.md
Normal file
338
docs/components/validation/index.md
Normal file
@@ -0,0 +1,338 @@
|
||||
# Validation Framework
|
||||
|
||||
> **Dokumentationshinweis:** Diese Dokumentation ist vollständig aktualisiert und stellt die aktuelle Implementierung des Validation Frameworks korrekt dar.
|
||||
|
||||
## Übersicht
|
||||
|
||||
Das Validation Framework ist ein leistungsstarkes System zur Validierung von Objekten und Daten in der Anwendung. Es nutzt moderne PHP-Attribute, um Validierungsregeln direkt an Objekteigenschaften zu definieren, und bietet eine flexible, erweiterbare Architektur für verschiedene Validierungsanforderungen.
|
||||
|
||||
## Hauptkomponenten
|
||||
|
||||
### Validator-Klasse
|
||||
|
||||
Die zentrale Klasse für die Validierungsfunktionalität:
|
||||
|
||||
```php
|
||||
// Klasse initialisieren
|
||||
$validator = new Validator($reflectionProvider);
|
||||
|
||||
// Objekt validieren
|
||||
$result = $validator->validate($object);
|
||||
|
||||
// Validierungsergebnis prüfen
|
||||
if ($result->hasErrors()) {
|
||||
// Fehlerbehandlung
|
||||
$errors = $result->getAllErrorMessages();
|
||||
}
|
||||
```
|
||||
|
||||
### ValidationRule-Interface
|
||||
|
||||
Das Basis-Interface für alle Validierungsregeln:
|
||||
|
||||
```php
|
||||
interface ValidationRule
|
||||
{
|
||||
public function validate(mixed $value): bool;
|
||||
public function getErrorMessages(): array;
|
||||
}
|
||||
```
|
||||
|
||||
Alle Validierungsregeln implementieren dieses Interface und werden als PHP-Attribute verwendet.
|
||||
|
||||
### ValidationResult-Klasse
|
||||
|
||||
Speichert und verwaltet Validierungsergebnisse:
|
||||
|
||||
- Sammelt Fehlermeldungen für verschiedene Felder
|
||||
- Bietet Methoden zum Abfragen von Fehlern
|
||||
- Ermöglicht das Zusammenführen mehrerer Validierungsergebnisse
|
||||
|
||||
```php
|
||||
// Fehler prüfen
|
||||
if ($result->hasErrors()) {
|
||||
// Alle Fehlermeldungen abrufen
|
||||
$allErrors = $result->getAllErrorMessages();
|
||||
|
||||
// Fehler für ein bestimmtes Feld abrufen
|
||||
$fieldErrors = $result->getFieldErrors('email');
|
||||
}
|
||||
```
|
||||
|
||||
## Validierungsregeln
|
||||
|
||||
Das Framework bietet eine Vielzahl vordefinierter Validierungsregeln:
|
||||
|
||||
### Grundlegende Regeln
|
||||
|
||||
- **Required**: Stellt sicher, dass ein Wert vorhanden ist
|
||||
- **Email**: Validiert E-Mail-Adressen
|
||||
- **Url**: Validiert URLs
|
||||
- **Numeric**: Stellt sicher, dass ein Wert numerisch ist
|
||||
- **StringLength**: Validiert die Länge eines Strings
|
||||
|
||||
### Erweiterte Regeln
|
||||
|
||||
- **Pattern**: Validiert Werte gegen reguläre Ausdrücke
|
||||
- **Range**: Validiert numerische Werte innerhalb eines Bereichs
|
||||
- **In**: Prüft, ob ein Wert in einer Liste gültiger Werte enthalten ist
|
||||
- **DateFormat**: Validiert Datumsformate
|
||||
- **Phone**: Validiert Telefonnummern
|
||||
- **Ulid**: Validiert ULID-Werte
|
||||
- **IsTrue**: Prüft, ob ein Wert true ist
|
||||
|
||||
### Benutzerdefinierte Regeln
|
||||
|
||||
Eigene Validierungsregeln können durch Implementierung des ValidationRule-Interfaces erstellt werden:
|
||||
|
||||
```php
|
||||
#[Attribute(Attribute::TARGET_PROPERTY)]
|
||||
final readonly class CustomRule implements ValidationRule
|
||||
{
|
||||
public function __construct(
|
||||
private string $param,
|
||||
private ?string $message = null
|
||||
) {
|
||||
}
|
||||
|
||||
public function validate(mixed $value): bool
|
||||
{
|
||||
// Validierungslogik implementieren
|
||||
return true; // oder false
|
||||
}
|
||||
|
||||
public function getErrorMessages(): array
|
||||
{
|
||||
return [$this->message ?? 'Standardfehlermeldung'];
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Verwendung
|
||||
|
||||
### Objekte mit Attributen validieren
|
||||
|
||||
```php
|
||||
class UserData
|
||||
{
|
||||
#[Required]
|
||||
#[StringLength(min: 3, max: 50)]
|
||||
public string $name;
|
||||
|
||||
#[Required]
|
||||
#[Email]
|
||||
public string $email;
|
||||
|
||||
#[StringLength(max: 500)]
|
||||
public ?string $bio = null;
|
||||
|
||||
#[Range(min: 18)]
|
||||
public ?int $age = null;
|
||||
}
|
||||
|
||||
// Validierung durchführen
|
||||
$userData = new UserData();
|
||||
$userData->name = 'Max';
|
||||
$userData->email = 'invalid-email';
|
||||
|
||||
$result = $validator->validate($userData);
|
||||
```
|
||||
|
||||
### Validierungsgruppen
|
||||
|
||||
Das Framework unterstützt Validierungsgruppen, um verschiedene Validierungsszenarien zu ermöglichen:
|
||||
|
||||
```php
|
||||
class UserData
|
||||
{
|
||||
#[Required(groups: ['registration', 'profile'])]
|
||||
#[StringLength(min: 3, max: 50)]
|
||||
public string $name;
|
||||
|
||||
#[Required(groups: ['registration'])]
|
||||
#[Email]
|
||||
public string $email;
|
||||
|
||||
#[Required(groups: ['profile'])]
|
||||
#[StringLength(max: 500)]
|
||||
public ?string $bio = null;
|
||||
}
|
||||
|
||||
// Validierung mit Gruppe durchführen
|
||||
$result = $validator->validate($userData, 'registration');
|
||||
```
|
||||
|
||||
### Fehlerbehandlung
|
||||
|
||||
```php
|
||||
if ($result->hasErrors()) {
|
||||
foreach ($result->getAll() as $field => $errors) {
|
||||
echo "Fehler im Feld '$field':\n";
|
||||
foreach ($errors as $error) {
|
||||
echo "- $error\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Integration
|
||||
|
||||
### Formular-Validierung
|
||||
|
||||
Das Framework bietet eine `ValidationFormHandler`-Klasse für die Validierung von Formulardaten:
|
||||
|
||||
```php
|
||||
// In einem Controller
|
||||
public function handleForm(Request $request, ValidationFormHandler $formHandler): Response
|
||||
{
|
||||
$formData = $request->getFormData();
|
||||
|
||||
$result = $formHandler->validate(UserData::class, $formData);
|
||||
|
||||
if ($result->hasErrors()) {
|
||||
return $this->renderForm('user_form', [
|
||||
'errors' => $result->getAll(),
|
||||
'data' => $formData
|
||||
]);
|
||||
}
|
||||
|
||||
// Erfolgreiche Validierung, Daten verarbeiten
|
||||
$this->userService->createUser($formData);
|
||||
|
||||
return $this->redirect('/success');
|
||||
}
|
||||
```
|
||||
|
||||
### Middleware-Integration
|
||||
|
||||
Das Framework bietet eine `InputValidationMiddleware` für die automatische Validierung von API-Anfragen:
|
||||
|
||||
```php
|
||||
// In der Bootstrap-Datei oder Router-Konfiguration
|
||||
$app->addMiddleware(InputValidationMiddleware::class);
|
||||
```
|
||||
|
||||
Konfiguration in `config/validation.php`:
|
||||
|
||||
```php
|
||||
return [
|
||||
'routes' => [
|
||||
'/api/users' => [
|
||||
'POST' => UserData::class,
|
||||
'PUT' => UserUpdateData::class
|
||||
]
|
||||
]
|
||||
];
|
||||
```
|
||||
|
||||
## Erweiterbarkeit
|
||||
|
||||
### Eigene Validierungsregeln erstellen
|
||||
|
||||
1. Interface implementieren:
|
||||
|
||||
```php
|
||||
#[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."];
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
2. Verwendung:
|
||||
|
||||
```php
|
||||
class UserRegistration
|
||||
{
|
||||
#[Required]
|
||||
#[Email]
|
||||
public string $email;
|
||||
|
||||
#[Required]
|
||||
#[Password(minLength: 10)]
|
||||
public string $password;
|
||||
}
|
||||
```
|
||||
|
||||
### Validierungsgruppen implementieren
|
||||
|
||||
Für Regeln, die Validierungsgruppen unterstützen sollen, implementieren Sie das `GroupAware`-Interface:
|
||||
|
||||
```php
|
||||
#[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);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Fehlerbehebung
|
||||
|
||||
### Häufige Probleme
|
||||
|
||||
1. **Validierungsregeln werden nicht angewendet**:
|
||||
- Stellen Sie sicher, dass die Attribute korrekt definiert sind
|
||||
- Überprüfen Sie, ob die Eigenschaften für den Validator zugänglich sind (public oder mit Reflection)
|
||||
|
||||
2. **Falsche Fehlermeldungen**:
|
||||
- Überprüfen Sie die Reihenfolge der Validierungsregeln
|
||||
- Stellen Sie sicher, dass die Regeln für den richtigen Datentyp verwendet werden
|
||||
|
||||
3. **Leistungsprobleme**:
|
||||
- Verwenden Sie ValidationCacheDecorator für häufig validierte Objekte
|
||||
- Vermeiden Sie zu komplexe Validierungsregeln
|
||||
|
||||
## Weiterführende Informationen
|
||||
|
||||
- [Verfügbare Validierungsregeln](rules.md)
|
||||
- [Formular-Integration](examples.md)
|
||||
- [API-Validierung](/guides/api-validation.md)
|
||||
Reference in New Issue
Block a user