Programmation PHP/Symfony/Évènement


InstallationModifier

Terminal
 
composer require symfony/event-dispatcher


UtilisationModifier

Pour exécuter du code après certaines exécutions du code, il faut créer une classe qui écoute ces évènements : un event listener[1].

Cette classe doit peut être reliée à son évènement soit dans sa déclaration de service (en YAML), soit par l'intermédiaire d'un souscripteur (event subscriber). Le listener a l'inconvénient de devoir être déclaré avec un tag alors que le subscriber lui, est chargé à chaque exécution du programme, donc alourdit légèrement les performances.

Pour lister les évènements et écouteurs d'un projet (avec leurs priorités) :

 php bin/console debug:event-dispatcher

Ex :

"console.terminate" event
-------------------------

 ------- ----------------------------------------------------------------------------- ----------
  Order   Callable                                                                      Priority
 ------- ----------------------------------------------------------------------------- ----------
  #1      Symfony\Component\Console\EventListener\ErrorListener::onConsoleTerminate()   -128
  #2      Symfony\Bridge\Monolog\Handler\ConsoleHandler::onTerminate()                  -255
 ------- ----------------------------------------------------------------------------- ----------

Exemple YAMLModifier

services:
    App\EventListener\MyViewListener:
        tags:
            - { name: kernel.event_listener, event: kernel.view }
class MyViewListener
{
    public function onKernelException(ExceptionEvent $event)
    {
        echo "Triggered!";
    }
}

Exemple avec souscripteurModifier

Un souscripteur doit forcément implémenter EventSubscriberInterface.

class ViewSubscriber implements EventSubscriberInterface
{
    public function getSubscribedEvents(): array
    {
        return [
            KernelEvents::VIEW => ['onView']
        ];
    }

    public function onView(ViewEvent $event): void
    {
        echo "Triggered!";
    }
}

DébogageModifier

Les erreurs qui surviennent selon certains évènements ne sont pas faciles à provoquer ou visualiser. Pour les voir sans passer par le profiler, on peut ajouter temporairement dans un contrôleur :

$this->getEventDispatcher()->dispatch('mon_service');

RéférencesModifier