Extra Block Types (EBT) - Nueva experiencia con Layout Builder❗

Extra Block Types (EBT): tipos de bloques con estilo y personalizables: Presentaciones de diapositivas, Pestañas, Tarjetas, Acordeones y muchos más. Configuraciones integradas para fondo, DOM Box y plugins de JavaScript. Experimenta hoy el futuro de la construcción de diseños.

Módulos de demostración EBT Descargar módulos EBT

❗Extra Paragraph Types (EPT) - Nueva experiencia con Paragraphs

Extra Paragraph Types (EPT): conjunto de módulos basado en párrafos de forma análoga.

Módulos de demostración EPT Descargar módulos EPT

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.