logo

Paleta de lienzo: 隆Hazlo colorido!馃帹

Palette - Constructor visual de p谩ginas, no se requiere t铆tulo en dise帽o.

Demo en vivo Descargar Palette

Scroll

9.12. Despachador de eventos, c贸digo personalizado para ciertos eventos

04/05/2025, by Ivan

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:

https://www.drupal.org/docs/8/creating-custom-modules/event-systems-overview-how-to-subscribe-to-and-dispatch-events

Este sistema reemplaza hooks comunes como hook_init() y hook_boot() y permite mayor flexibilidad y control estructurado.