Chapitre 10Projet SunuLearn

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