Skip to content

Instantly share code, notes, and snippets.

@saro0h
Last active August 29, 2015 14:07
Show Gist options
  • Save saro0h/84b8bef80d6128c88bdd to your computer and use it in GitHub Desktop.
Save saro0h/84b8bef80d6128c88bdd to your computer and use it in GitHub Desktop.
Event listener, event subscriber

En tant qu'utilisateur, je souhaite rendre mon site web disponible du dimanche au vendredi.

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.

Etapes:

  1. Créer une classe OpenDaysListener avec la logique métier répondant à la user story.
  2. Créer une classe de contrôlleur + l'action avec le template affichant le message "We are open".
  3. Construire la définition du service l'event listener dans le fichier YourBundle/Resource/config/service.xml.
  4. Ecrire la configuration dans le fichier app/config/config.yml.
  5. Écrire la description de la configuration dans le classe YourBundle/Configuration.php. Tips : utiliser les méthode info() et example()
  6. 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']));
  7. Puis créer le constructeur dans l'eventListener afin d'injecter les variables de configuration.
  8. Il est temps de modifier l'eventListener en eventSubscriber :
    • la classe OpenDaysListener doit implémenter la class EventSubscriberInterface
    • Implémenter la méthode getSubscribedEvents afin de déterminer que l'eventSubscriber écoute l'évènement KernelEvents::REQUEST
  9. Modifier le tag du service pour kernel.event_subscriber
  10. Créer la classe TriggerTimeEvent avec la méthode getTriggeredTime (récupérant de la date à laquelle l'évènement a été dispatché) et la constante TRIGGER_TIME.
  11. 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.
  12. Dans la méthode onKernelRequest du listener, dispatcher l'évènement TriggerTimeEvent::TRIGGER_TIME un jour avant le dernier jour d'ouverture.
  13. Créer un eventSubscriber TriggerTimeListener écoutant l'évènement TriggerTimeEvent::TRIGGER_TIME.
  14. Définir l'eventSubscriber en tant que service avec le tag ``kernel.event_subscriber```.
  15. 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".
  16. Tester la classe OpenDaysListener avec une subsrequest.
  17. Tester que le site web est fermé le dimanche.
  18. Tester que le site web est ouvert le jeudi.
  19. 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 :

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment