Quiz 2 — Cœur & Doctrine
1. Par quel fichier unique entrent toutes les requêtes ?
Réponse
Le front controller public/index.php (seul dossier exposé au web).
2. Que prend et que renvoie HttpKernel::handle() ?
Réponse
Une Request en entrée, une Response en sortie.
3. À quoi sert l’événement kernel.terminate ?
Réponse
Exécuter des tâches après l’envoi de la réponse (logs lourds, e-mails) sans faire attendre le client.
4. Comment déclare-t-on une route en Symfony 7.4 ?
Réponse
Par un attribut #[Route(...)] (plus une annotation dans un commentaire).
5. Pourquoi ne jamais coder une URL en dur ?
Réponse
Un changement de chemin casserait les liens ; on génère par nom de route (path()/generateUrl()).
6. Que fait #[MapRequestPayload] ?
Réponse
Il désérialise + valide le corps JSON dans un DTO ; échec → 422 automatique.
7. Où doit vivre la logique métier ?
Réponse
Dans des services ; le contrôleur reste fin (lire, déléguer, répondre).
8. Qu’est-ce que l’autowiring ?
Réponse
L’injection automatique des dépendances par leur type (aucune config dans le cas courant).
9. Pourquoi injecter une interface plutôt qu’une classe concrète ?
Réponse
Pour le découplage et la testabilité (changer d’implémentation ou injecter un double sans modifier le code).
10. Un service est-il recréé à chaque injection ?
Réponse
Non : c’est un singleton (une instance partagée). D’où l’importance de services sans état.
11. Comment collecte-t-on une famille de services taggés ?
Réponse
Avec #[AutowireIterator('tag')] (ou un #[AutowireLocator] pour un chargement paresseux par clé).
12. Que découple l’EventDispatcher, et est-il synchrone ?
Réponse
« Il s’est passé X » de « réagir à X ». Synchrone ; pour du différé, Messenger.
13. Quel pattern de persistance Doctrine suit-il ?
Réponse
Data Mapper : l’entité est pure, l’EntityManager persiste (vs Active Record).
14. Différence entre persist() et flush() ?
Réponse
persist() planifie ; flush() exécute les opérations en attente (dans une transaction).
15. Dans une relation ManyToOne/OneToMany, quel côté est propriétaire ?
Réponse
Le ManyToOne (porte la FK, inversedBy). L’autre est inverse (mappedBy).
16. Pourquoi maintenir les deux côtés d’une relation ?
Réponse
Doctrine ne persiste que d’après le côté propriétaire ; les helpers addX/removeX synchronisent les deux.
17. Migrations ou fixtures pour le schéma ? Pour la démo ?
Réponse
Migrations pour le schéma, fixtures pour les données de démo/test.
18. Qu’est-ce que le N+1, et comment le corriger ?
Réponse
1 requête + N requêtes sur une relation paresseuse ; corrigé par fetch join (join + addSelect).
19. Comment éviter l’injection SQL avec Doctrine ?
Réponse
Toujours des paramètres nommés + setParameter(), jamais de concaténation.
20. Peut-on envoyer un e-mail dans un événement Doctrine (postPersist) ?
Réponse
À éviter : ça se produit pendant la transaction. On dispatche un événement de domaine après flush (ou Messenger).
Quiz suivant : Quiz 3 — Full-stack & sécurité.