Artículo

EventDispatcher: el sucesor natural de los hooks en Drupal

Tech & innovation

EventDispatcher: el sucesor natural de los hooks en Drupal

Este sábado asistí a la DrupalCamp de Granada, donde tuve la oportunidad de dar una charla. En concreto, hablé del componente de Symfony conocido como EventDispatcher, que ha sido incorporado en la última versión de Drupal, y hablé de cómo este componente puede convertirse en el reemplazo definitivo de los hooks. Si estás interesado en ver la charla, aquí tienes al vídeo: También puedes echar un vistazo a las slides de mi presentación. No obstante, si prefieres ir al grano y ver cómo puedes hacer uso del EventDispatcher en tus propios proyectos Drupal, sigue leyendo :)

Qué es el EventDispatcher

El EventDispatcher es un componente de Symfony que implementa el patrón Mediador, y es básicamente un mecanismo que facilita la comunicación entre los diferentes componentes de nuestro sistema. Su funcionamiento se resume en el siguiente diagrama: Event Dispatcher Tenemos:

  • Subscribers: informan al EventDispatcher de que quieren ser notificados cuando un evento ocurra.
  • Eventos: cuando una clase quiere lanzar un evento, le pasa la instancia de ese evento al EventDispatcher.
  • EventDispatcher: el EventDispatcher recibe instancias de eventos y se las envía a todos los suscriptores de ese evento en concreto.

Aquí un ejemplo de funcionamiento de Event Dispatcher:

Ahora veremos cómo podemos escribir código que haga uso de este componente. Para ilustrar el código me basaré en el mismo ejemplo que usé en la charla: Pedro tiene que avisar a sus amigos cuando se vaya de la oficina, para que así ellos puedan prepararse para quedar.

  • Pedro yéndose de la oficina = Evento siendo lanzado
  • Amigos preparándose para la reunión = Subscribers reaccionando al evento

Cómo suscribirme a un evento.

Lo primero que vamos a ver es cómo puedo estar al tanto de un evento para que, cuando ocurra, pueda llevar a cabo las acciones que me interesen. Para ello, nada mejor que ver un ejemplo de una clase que se suscribe a un evento: [gist id="7ca67c3cd3f0b933e3279dcd09eefe1c"] Nuestra clase suscriptora tiene que implementar la interfaz EventSubscriberInterface, y concretamente la función getSubscribedEvents. Dentro de esta función crearemos un array donde definiremos todos los eventos a los que nos queremos suscribir. Para cada evento definiremos una función de callback. Cada callback será representado por un array donde tendremos 2 valores: el nombre de la función que queremos ejecutar cuando ocurra el evento y un número que representa la prioridad. Básicamente, cuanto mayor es este número, mayor será la prioridad del callback. Finalmente, dentro de la propia clase implementaremos todas las funciones de callback que hayamos definido. Cada función de callback recibe una instancia del evento que ha sido lanzado en el primer parámetro. Sin embargo, esta función recibe otros dos parámetros adicionales, a los que podemos acceder si es necesario: el nombre del evento y el EventDispatcher en sí. Una vez que hemos implementado la clase, sólo nos falta registrarla como servicio: [gist id="429fd980bb15d982c5e67456a33c2926"]

Cómo lanzar un evento

Ahora que ya sabemos suscribirnos a eventos, es hora de lanzar nuestros propios eventos. Lo primero que necesitamos es obtener una instancia del EventDispatcher. Para ello, podemos hacerlo de dos formas: Estáticamente: [gist id="062a197a4da7f92c395719b222296de4"] O con inyección de dependencias: [gist id="d862be969b3a5bb08ac3d627a560fbc2"] El siguiente paso es opcional, y consiste en extender la clase Event que nos proporciona el EventDispatcher: [gist id="f830cb9907751a1c7e1e3996b5df6219"] Este paso sólo es necesario si tenemos que pasar algún dato a nuestros suscriptores, o bien si tenemos que hacer algún tipo de lógica compleja dentro de la propia clase del evento. Si no fuera el caso, podríamos simplemente crear una instancia de la clase Event y lanzarla. Finalmente, todo lo que queda por hacer es lanzar el evento: [gist id="bc9e9f2a092827265cc57096b2d86853"] La función dispatch recibe dos parámetros: el nombre y la instancia del evento que queremos lanzar. Esta función devuelve la instancia del evento después de haber sido procesada por todos los suscriptores de dicho evento.

Conclusión

Espero que hayas disfrutado con esta explicación rápida de cómo usar el EventDispatcher. No obstante, si te has quedado con ganas de más, de nuevo te invito a que veas el vídeo de la charla que di el sábado donde encontrarás una explicación algo más completa.

¡Hablemos!