Event sourcing : arrête de perdre l'historique, utilise-le
L'event sourcing, c'est quoi (et non, ce n'est pas du logging)
En event sourcing, la source de vérité, ce sont les événements. Tu ne stockes pas "l'état final" d'un objet, tu stockes tout ce qui lui arrive. Ensuite, tu reconstruis l'état en rejouant ces événements. Oui, comme un replay. Et non, ce n'est pas "juste des logs" : un log raconte, un événement fait foi.
Exemple bête : au lieu de sauvegarder un balance = 120, tu enregistres MoneyDeposited(200) puis MoneyWithdrawn(80). Le solde est un résultat, pas une vérité magique tombée du ciel.
Pourquoi tu t'embêtes avec ça ?
Parce que ton futur toi va te remercier quand :
- tu dois auditer qui a fait quoi, quand, et pourquoi,
- tu veux debugger un bug en rejouant la réalité,
- tu dois reconstruire un modèle après un changement métier,
- tu veux brancher des projections (read models) sans massacrer ta base.
En clair : tu paies un peu de complexité maintenant, pour arrêter d'improviser des post-mortems plus tard.
Les briques à comprendre (version sans fumée)
- Événement : un fait immuable, au passé.
OrderPlaced, pasPlaceOrder. - Stream : la suite des événements d'un même agrégat.
- Agrégat : l'objet métier qui applique les événements pour se reconstruire.
- Projection : une vue dérivée (SQL, Elastic, cache, etc.) pour lire vite.
Quand l'utiliser (et quand éviter)
Tu l'utilises si :
- ton domaine change souvent,
- l'historique est critique,
- tu as besoin de traçabilité béton.
Tu l'évites si :
- ton CRUD est basique,
- tu n'as pas de besoins d'audit,
- tu ne veux pas expliquer ça à une équipe qui découvre déjà les repositories.
Mini exemple d'initiation en Symfony
On va faire simple : un agrégat Cart, des événements, et un petit event store en mémoire. Pas de CQRS complet, pas de Kafka, pas de magie. Juste le cœur.
1) Définir l'événement
php
2) L'agrégat qui rejoue les événements
php
3) Un event store minimal (en mémoire)
php
4) Usage dans un service Symfony
php
Voilà : pas de ORM, pas de cache, pas de fanfare. Juste l'idée centrale : les événements sont la vérité, l'état est une vue calculée. Tu peux ensuite brancher des projections et des listeners Symfony Messenger si tu veux jouer avec les grands.
À retenir (si tu dois l'expliquer à quelqu'un)
- L'event sourcing stocke l'histoire, pas seulement le résultat.
- Tu reconstruis l'état en rejouant les événements.
- C'est parfait pour l'audit et l'évolution métier, inutile pour un CRUD banal.
- Symfony ne fait pas tout tout seul, mais il te laisse structurer proprement.
Si ça te paraît lourd, c'est normal : tu remplaces un confort immédiat par de la lisibilité long terme. Et ce trade-off, c'est toi qui le payes. Ou ton futur toi. À toi de voir.