Critères d'acceptances :
[X] Faire un EventListener sur kernel.request qu'il soit déclenché au plus tôt
[X] N'exécuter la logique de l'eventListener uniquement s'il s'agit de la master request
[X] La jours de disponibilité sont configurable
[X] Convertir l'eventListener en EventSubscriber
[X] Créer un événements custom avec une méthode retournant un datetime
[X] Dans le event subscriber, dispatcher l'évènement custom 1 jour avant la fermeture.
[X] Tester l'EventSubscriber.
- Créer une classe
OpenDaysListener
avec la logique métier répondant à la user story. - Créer une classe de contrôlleur + l'action avec le template affichant le message "We are open".
- Construire la définition du service l'event listener dans le fichier
YourBundle/Resource/config/service.xml
. - Ecrire la configuration dans le fichier
app/config/config.yml
. - Écrire la description de la configuration dans le classe
YourBundle/Configuration.php
. Tips : utiliser les méthodeinfo()
etexample()
- Déclarer la configuration et injecter les variables de configurations dans le container d'injection dépendance.
$definition = $container->findDefinition('playground_demo.open_days_listener');
$definition->setArguments(array($config['open_day'], $config['close_day']));
- Puis créer le constructeur dans l'eventListener afin d'injecter les variables de configuration.
- Il est temps de modifier l'eventListener en eventSubscriber :
- la classe
OpenDaysListener
doit implémenter la classEventSubscriberInterface
- Implémenter la méthode
getSubscribedEvents
afin de déterminer que l'eventSubscriber écoute l'évènementKernelEvents::REQUEST
- la classe
- Modifier le tag du service pour
kernel.event_subscriber
- Créer la classe
TriggerTimeEvent
avec la méthodegetTriggeredTime
(récupérant de la date à laquelle l'évènement a été dispatché) et la constanteTRIGGER_TIME
. - Injecter l'eventDispatcher dans le listener, depuis la classe d'Extension en récupérant la définition du service
playground_demo.open_days_listener
en premier lieu puis en utilisant la méthode ``setArguments(new Reference('event_dispatcher')). NB : Vous pouvez accéder à l'eventDispatcher depuis l'objet event, ceci dit la méthode
getDispatcher()` est dépréciée depuis la version 2.3 de Symfony. - Dans la méthode
onKernelRequest
du listener, dispatcher l'évènementTriggerTimeEvent::TRIGGER_TIME
un jour avant le dernier jour d'ouverture. - Créer un eventSubscriber
TriggerTimeListener
écoutant l'évènementTriggerTimeEvent::TRIGGER_TIME
. - Définir l'eventSubscriber en tant que service avec le tag ``kernel.event_subscriber```.
- Créer une méthode
onTriggerTime
dans le listener qui logguera les informations du triggerTime (utiliser le loggerInterface de Psr\log). Pour vérifier que l'eventSubscriber a bien été appelé, consultez le Symfony profiler, section "Events". - Tester la classe
OpenDaysListener
avec une subsrequest. - Tester que le site web est fermé le dimanche.
- Tester que le site web est ouvert le jeudi.
- Tester que le
TriggerTimeEvent
est dispatché un jour avant la fermeture du site.
Et voilà!
Code associé : https://github.com/poledev/Katas/blob/kata-event-listener/README.md
Un peu de documentation :