Les événements
Symfony, en tant qu'écosystème à part entière, définit des dizaines de composants portant chacun des fonctionnalités différentes.
En-dehors de Symfony, on trouve bien sûr d'autres écosystèmes, d'autres packages, définissant d'autres fonctionnalités (Doctrine, Twig, ...).
L'extensibilité
La question qui se pose alors, c'est comment rendre tous ces packages, définis séparément, extensibles ? Quand on parle d'extensibilité, on parle d'ajouter des comportements spécifiques, un peu comme si on parlait d'héritage, aux comportements prévus à l'origine par les créateurs d'un package.
Mais parfois, l'héritage a ses limites.
Si je veux, par exemple, effectuer une action à un moment précis, mettons juste avant l'enregistrement d'une ligne dans ma base de données, devrais-je hériter d'un EntityManager pour inclure ma fonctionnalité ? Ou bien devrais-je simplement exécuter mon comportement juste avant d'appeler les méthodes persist et flush ?
Si j'optais alors pour la seconde solution, comment pourrais-je faire si j'ai besoin de ce comportement à plusieurs endroits dans mon application ?
Le système d'événements
Les événements, de manière générale, sont issus de ce qu'on appelle un design pattern (patron de conception). Les design patterns nous permettent parfois, si nous rencontrons une problématique, de la régler avec une solution précise.
Par exemple, un système d'événements nous permet de définir des points dans notre application où nous autoriserons l'exécution d'un autre code.
Pour ce faire, nous diffuserons au sein de l'application un événement, à un moment donné. Une autre partie du code pourra alors écouter cet événement, et s'exécuter au moment où l'événement sera diffusé.
Reprenons l'exemple ci-dessus : Doctrine définit un événement prePersist qui est diffusé automatiquement avant l'enregistrement d'une ligne en base de données. Nous pouvons alors définir une classe qui va écouter cet événement et se déclencher automatiquement avant l'enregistrement d'une ligne.
Le système d'événements provient du design pattern Observer
L'event dispatcher
Dans l'écosystème Symfony, le composant symfony/event-dispatcher permet d'effectuer l'enregistrement et l'appel d'événements au sein de l'application. On utilisera le dispatcher pour diffuser des événements au sein de l'application.
En fait, notre application diffuse déjà régulièrement des événements. Nous allons donc voir comment écouter des événements, mais aussi comment diffuser nos propres événements.
Le dispatcher provient du design pattern Mediator