9.12. Despachador de eventos, código personalizado para ciertos eventos
9.11.4. El sistema de eventos en Drupal
El sistema de eventos permite construir sistemas más complejos con la capacidad de modificar la funcionalidad utilizando código personalizado que se ejecuta ante ciertos eventos. Muchos hooks de Drupal 7 han sido reemplazados por eventos en Drupal 8 y versiones posteriores. Este sistema proviene de Symfony y está compuesto por varios elementos:
- Suscriptores de eventos (Event Subscribers): Son clases que implementan
\Symfony\Component\EventDispatcher\EventSubscriberInterface
y que reaccionan ante eventos específicos. - Registro de eventos (Event Registry): Registra todos los suscriptores, almacenando su nombre y prioridad en el despachador.
- Despachador de eventos (Event Dispatcher): Se encarga de invocar los suscriptores registrados cuando se produce un evento.
- Contexto del evento (Event Context): Conjunto de datos que se pasa a los suscriptores. Es una clase que extiende
\Symfony\Component\EventDispatcher\Event
.
Puedes ver un ejemplo práctico en el módulo drupalbook_examples, disponible en GitHub:
https://github.com/levmyshkin/drupalbook8
Reemplazo de hook_init()
con Event Subscriber
Desde Drupal 8, el hook_init()
ya no está disponible:
https://www.drupal.org/node/2013014
Para ejecutar código al cargar una página, se puede usar un Event Subscriber.
1. Definir el servicio en drupalbook_examples.services.yml
services:
drupalbook_examples.event_subscriber:
class: Drupal\drupalbook_examples\EventSubscriber\DrupalbookExamplesSubscriber
tags:
- { name: event_subscriber }
2. Crear la clase del suscriptor de eventos
modules/custom/drupalbook_examples/src/EventSubscriber/DrupalbookExamplesSubscriber.php
<?php
namespace Drupal\drupalbook_examples\EventSubscriber;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class DrupalbookExamplesSubscriber implements EventSubscriberInterface {
public function checkForRedirection(GetResponseEvent $event) {
if ($event->getRequest()->query->get('redirect-me')) {
$event->setResponse(new RedirectResponse(\Drupal::url('<front>', [], ['absolute' => TRUE])));
}
}
public function redirectBeforeWithoutCache(GetResponseEvent $event) {
if ($event->getRequest()->query->get('redirect-me')) {
$event->setResponse(new RedirectResponse(\Drupal::url('<front>', [], ['absolute' => TRUE])));
}
}
public static function getSubscribedEvents() {
$events[KernelEvents::REQUEST][] = ['checkForRedirection'];
$events[KernelEvents::REQUEST][] = ['redirectBeforeWithoutCache', 300];
return $events;
}
}
Prioridades y Cache
La prioridad (segundo parámetro en getSubscribedEvents()
) define el orden en que se ejecutan los métodos. Un valor más alto indica mayor prioridad.
Por ejemplo, con una prioridad de 300
en redirectBeforeWithoutCache()
, el evento se ejecuta antes que los métodos registrados con prioridad por defecto. Esto permite evitar el sistema de caché y realizar redirecciones aunque la página esté cacheada.
Recursos adicionales
Documentación oficial sobre el sistema de eventos en Drupal:
Este sistema reemplaza hooks comunes como hook_init()
y hook_boot()
y permite mayor flexibilidad y control estructurado.