Formulaires et validation
Validation des données, Form Requests et messages d'erreur
Concepts Théoriques
SunuLearn doit permettre aux enseignants de créer des formations. Cela implique un formulaire de création, la validation des données soumises, et l'affichage des erreurs.
Le formulaire Blade
<form action="{{ route('formations.store') }}" method="POST">
@csrf
<input type="text" name="title" value="{{ old('title') }}">
@error('title')
<p class="text-red-500">{{ $message }}</p>
@enderror
<button type="submit">Créer</button>
</form>@csrf ajoute le token de sécurité. old('title') réaffiche la valeur saisie si la validation échoue. @error affiche le message d'erreur pour ce champ.
Validation dans le contrôleur
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|string|max:255',
'slug' => 'required|string|unique:formations,slug',
'short_description' => 'required|string|max:500',
'category_id' => 'required|exists:categories,id',
'level' => 'required|in:debutant,intermediaire,avance',
]);
Formation::create($validated);
return redirect()->route('formations.index')
->with('success', 'Formation créée avec succès !');
}Si la validation échoue, Laravel redirige automatiquement vers le formulaire avec les erreurs et les anciennes valeurs.
Form Requests — validation dédiée
Pour des formulaires complexes, extraire la validation dans une classe :
php artisan make:request StoreFormationRequest// app/Http/Requests/StoreFormationRequest.php
class StoreFormationRequest extends FormRequest
{
public function authorize(): bool
{
return true; // On gèrera les autorisations au ch.12
}
public function rules(): array
{
return [
'title' => 'required|string|max:255',
'slug' => 'required|string|unique:formations,slug',
'short_description' => 'required|string|max:500',
'description' => 'nullable|string',
'category_id' => 'required|exists:categories,id',
'level' => 'required|in:debutant,intermediaire,avance',
'duration' => 'nullable|string|max:20',
];
}
public function messages(): array
{
return [
'title.required' => 'Le titre est obligatoire.',
'slug.unique' => 'Ce slug est déjà utilisé.',
'category_id.exists' => 'Cette catégorie n\'existe pas.',
];
}
}Utilisation dans le contrôleur :
public function store(StoreFormationRequest $request)
{
Formation::create($request->validated());
return redirect()->route('formations.index')->with('success', 'Formation créée !');
}Laravel injecte automatiquement le Form Request, exécute la validation, et ne continue que si tout est valide. Le contrôleur reste propre.
Messages flash
return redirect()->route('formations.index')->with('success', 'Formation créée !');Dans le layout Blade :
@if (session('success'))
<div class="bg-green-100 text-green-800 p-4 rounded mb-4">
{{ session('success') }}
</div>
@endif