Examen blanc Niveau 4 - Laravel avancé (PRO)
Formation PHP-Laravel – Dresseur de Code
Objectif
Vérifier la maîtrise de la validation avancée, de l’API REST, des tests, de la sécurité et de la performance.
Réussite requise (14/20 minimum) pour accéder au Niveau 5 – Laravel expert.
Partie 1 – Validation & Form Request (4 pts)
Q1.1 (2 pts) Où déclare-t-on les règles de validation dans une Form Request ? Quelle méthode permet de personnaliser les messages d’erreur ?
Q1.2 (2 pts) Écrire les règles de validation pour un champ email (obligatoire, format email, unique dans la table users) et un champ password (obligatoire, min 8 caractères, avec confirmation).
Correction Q1.2
'email' => ['required', 'email', 'unique:users,email'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
Partie 2 – API REST (4 pts)
Q2.1 (2 pts) À quoi servent les API Resources dans Laravel ? Où définit-on la structure JSON renvoyée ?
Q2.2 (2 pts) Comment protéger les routes API pour qu’elles ne soient accessibles qu’avec un token ? Quel en-tête HTTP le client doit-il envoyer ?
Details
Réponses attendues
Q2.1 : Les API Resources servent à formater les modèles (ou collections) en structure JSON cohérente. La structure est définie dans la méthode toArray() de la classe Resource.Q2.2 : Middleware auth:sanctum. Le client envoie l’en-tête Authorization: Bearer <token>.
Partie 3 – Tests (4 pts)
Q3.1 (2 pts) Quelle est la différence entre un test unit et un test feature ? Quel trait Laravel utilise-t-on souvent en feature pour la base de données ?
Q3.2 (2 pts) Écrire un test feature qui : (1) crée un utilisateur avec une factory, (2) envoie une requête POST vers la route articles.store en étant connecté avec cet utilisateur, avec les champs title et body, (3) vérifie que la réponse est une redirection et qu’un enregistrement existe dans la table articles avec ce titre.
Correction Q3.2 (schéma)
public function test_authenticated_user_can_create_article(): void
{
$user = User::factory()->create();
$response = $this->actingAs($user)->post(route('articles.store'), [
'title' => 'Test',
'body' => 'Content',
]);
$response->assertRedirect();
$this->assertDatabaseHas('articles', ['title' => 'Test']);
}
Avec use RefreshDatabase sur la classe.
Partie 4 – Sécurité & Performance (8 pts)
Q4.1 (2 pts) Pourquoi doit-on utiliser Hash::make() pour stocker un mot de passe ? Comment vérifier un mot de passe en PHP avec Laravel ?
Q4.2 (2 pts) Comment limiter une route de login à 5 tentatives par minute par IP ?
Q4.3 (2 pts) Qu’est-ce que le problème N+1 ? Donner une solution en une ligne de code (exemple : charger des articles avec leur auteur).
Q4.4 (2 pts) Dans quel cas utilise-t-on un Job (queue) plutôt que d’exécuter une tâche directement dans le contrôleur ? Quelle commande lance le worker ?
Details
Réponses attendues
Q4.1 : Pour ne jamais stocker le mot de passe en clair ; vérification avec Hash::check($saisi, $user->password).Q4.2 : Middleware throttle:5,1 sur la route de login.
Q4.3 : N+1 = 1 requête + N requêtes pour une relation en boucle. Solution : Article::with('user')->get().
Q4.4 : Pour les tâches longues (email, export, API) pour ne pas bloquer la réponse HTTP. Commande : php artisan queue:work.
Barème (total 20 pts)
| Partie | Points |
|---|---|
| 1 – Validation & Form Request | 4 |
| 2 – API REST | 4 |
| 3 – Tests | 4 |
| 4 – Sécurité & Performance | 8 |
| Total | 20 |
Barème : 20 points. Passage au Niveau 5 à partir de 14/20.