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\EventSubscriberInterfacey 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.