Niv. 4 — Temps réel & async : réservations vivantes
Objectif : rendre l’application vivante — réservations, paiement Stripe, e-mails async et places en temps réel côté Next.js.
📋 Cahier des charges
Contexte — On passe du catalogue à la réservation : un client réserve un créneau, paie, reçoit une confirmation ; les places se mettent à jour en direct.
Périmètre inclus
- Entités
Slot(créneau, places) etBooking(statut :pending → confirmed → cancelled). - Créer une réservation via l’API ; e-mail de confirmation asynchrone (Messenger).
- Paiement Stripe (Checkout) ; confirmation par webhook signé (idempotent).
- Mercure : publier les places restantes d’un créneau ; le front Next.js les affiche en direct (
EventSource). - Scheduler : un rappel la veille (message planifié).
Périmètre exclu — multi-tenant, LTI (Niv. 5).
Livrables — un flux de réservation complet, temps réel et payant (en mode test Stripe).
Critères de réussite
- Une réservation créée déclenche un e-mail via un worker (pas dans la requête).
- Le paiement est confirmé par webhook (signature vérifiée), handler idempotent.
- Les places d’un créneau se mettent à jour en direct sur le front sans rechargement.
- Un rappel est planifié (Scheduler) et parti par le worker.
🗺️ Endroits à visiter
| Besoin | Chapitre |
|---|---|
| Messenger & workers | 12.1, 12.2 |
| Scheduler | 12.3 |
| Mailer | 12.4 |
| Mercure & Next.js | 12.5, 12.6 |
| Stripe | 12.7 |
🧭 Étapes suggérées
make:entity Slot+Booking(avec l’enum de statut) et les relations.composer require symfony/messenger, un messageSendBookingConfirmation+ handler, routé en async ; lancer un worker.composer require symfony/mailer(Mailpit en dev) ; e-mail Twig depuis le handler.composer require stripe/stripe-php: session Checkout + endpoint webhook (vérif signature, dispatch d’un message de confirmation).composer require symfony/mercure: publierseatsLeftà chaque réservation ; côté Next.js, un hookEventSource.composer require symfony/scheduler: planifier le rappel de la veille.
🎁 Bonus : ajoutez le Notifier pour envoyer aussi une alerte Slack à l’équipe en cas d’échec de paiement (12.4).
Projet suivant : Niv. 5 — Capstone : BookLab.