Créer un service listener qui écoute un évènement
26 01 2017

Symfony possède par défaut tout une série d'évènements (kernel.request, kernel.controller, kernel.view, kernel.response). Ces évènements permettent, à l'aide du gestionnaire d'évènements, d'effectuer des actions particulières. Nous pouvons ainsi inscrire du code métier qui s'éxecutera lors du déclenchement d'un évènement. Ce code on le définira en tant que service, c'est ce que l'on appelle communément un listener. Son rôle est d'écouter un évènement et de réagir en effectuant une action lors du déclenchement de celui-ci. On dit que le service listener écoute un évènement particulier. Ce concept est identique au pattern Observer en PHP. Sachez qu'il est également possible de créer son propre évènement. Mais dans ce tutoriel nous nous concentrerons sur un évènement de Symfony présent par défaut : kernel.request.
Le but de ce tutoriel est de pouvoir rediriger un utilisateur qui clique sur un bouton Mon compte vers la page de connexion afin qu'il ait accès aux informations personnelles de son compte. Vous pouvez voir le résultat final sur MyPanier.fr. Pour cela nous allons créer un service listener qui écoute l'évènement kernel.request.
L'évènement kernel.request est un évènement qui est déclenché très tôt dans l'exécution d'une page, avant même que le choix du contrôleur à exécuter ne soit fait. Son objectif est de permettre à un listener de retourner immédiatement une réponse, sans même passer par l'exécution d'un contrôleur. La classe de l'évènement donné en argument par le gestionnaire d'évènements est GetResponseEvent. Nous utiliserons sa méthode setResponse(Response $response) pour indiquer la redirection à effectuer.
Tout d'abord déclarons le listener dans services.yml
moncompteListener:
class: Boutique\BoutiqueBundle\ Listener\MoncompteListener
arguments: [@service_container,@session]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
Ensuite créons le listener dans un dossier Listener. Appelons ce fichier MoncompteListener.php
<?php
namespace Boutique\BoutiqueBundle\Listener;
use Symfony\Component \DependencyInjection
\ContainerInterface;
use Symfony\Component \HttpFoundation\Session\Session;
use Symfony\Component \HttpFoundation\RedirectResponse;
use Symfony\Component \HttpKernel\Event
\GetResponseEvent;
class MoncompteListener
{
public function __construct(ContainerInterface $container, Session $session)
{
$this->session = $session;
$this->router = $container->get('router');
$this->securityContext = $container->get('security.context');
}
public function onKernelRequest(GetResponseEvent $event)
{
$route = $event->getRequest()->attributes->get('_route');
if ($route == 'utilisateurs_homepage') {
if (!is_object($this->securityContext-> getToken()->getUser())) {
$this->session->getFlashBag()->add('notification','Vous devez vous identifier');
$event->setResponse(new RedirectResponse($this->router-> generate('fos_user_security_login')));
}
}
}
}
Voila à présent quand on clique sur le bouton Mon compte nous sommes invités à nous connecter.
catégorie: Symfony