logo

Extra Block Types (EBT) - Nuova esperienza con Layout Builder❗

Extra Block Types (EBT) - tipi di blocchi stilizzati e personalizzabili: Slideshows, Tabs, Cards, Accordion e molti altri. Impostazioni integrate per sfondo, DOM Box, plugin javascript. Vivi oggi il futuro della costruzione dei layout.

Demo moduli EBT Scarica moduli EBT

❗Extra Paragraph Types (EPT) - Nuova esperienza con Paragraphs

Extra Paragraph Types (EPT) - insieme di moduli basati su paragrafi in modo analogo.

Demo moduli EPT Scarica moduli EPT

Scorri

9.12. Event Dispatcher, codice personalizzato per determinati eventi

16/10/2025, by Ivan

Il sistema degli eventi consente di costruire sistemi più complessi, con la possibilità di modificare le funzionalità utilizzando codice personalizzato per determinati eventi. Molti hook di Drupal 7 sono stati sostituiti dagli eventi. Questo ha permesso di unificare il funzionamento di molte parti di Drupal e dei moduli aggiuntivi. Il sistema degli eventi deriva da Symfony e si compone dei seguenti elementi:

Event Subscribers – I “sottoscrittori” di eventi specifici sono funzioni o metodi che vengono eseguiti in corrispondenza di determinati eventi. Nel codice, si tratta di una classe che implementa l’interfaccia:

\Symfony\Component\EventDispatcher\EventSubscriberInterface

Event Registry – Raccoglie e ordina i sottoscrittori degli eventi in base alla sequenza di esecuzione. Il registro dei sottoscrittori è memorizzato nell’oggetto Event Dispatcher come un array chiave-valore del nome dell’evento e della sua priorità (ordine). Quando un evento è registrato come servizio, esso è disponibile globalmente come dispatcher.

Event Dispatcher – Il meccanismo in cui l’evento viene attivato e che consente di richiamare i sottoscrittori di eventi al momento opportuno. Nella maggior parte dei casi, almeno un’istanza dell’Event Dispatcher è rappresentata come servizio. La classe Event Dispatcher implementa:

\Symfony\Component\EventDispatcher\EventDispatcherInterface

Event Context – Molti eventi richiedono un insieme specifico di dati, che possono essere importanti per il sottoscrittore. Questo può essere un valore semplice passato al sottoscrittore oppure una classe che contiene i dati necessari. La classe Event Context estende la classe:

\Symfony\Component\EventDispatcher\Event

Vediamo alcuni esempi pratici per capire meglio come funziona tutto questo.

Ho aggiunto tutto il codice su GitHub nel modulo drupalbook_examples; puoi scaricare il modulo e aggiungerlo al tuo sito:

https://github.com/levmyshkin/drupalbook8

Drupal 8 non utilizza più hook_init():

https://www.drupal.org/node/2013014

Ora puoi eseguire il codice necessario durante il caricamento della pagina utilizzando un Event Subscriber:

modules/custom/drupalbook_examples/drupalbook_examples.services.yml

services:
  drupalbook_examples.event_subscriber:
    class: Drupal\drupalbook_examples\EventSubscriber\DrupalbookExamplesSubscriber
    tags:
    - { name: event_subscriber }

Per collegare un Event Subscriber, è necessario aggiungere il servizio nel file *.services.yml del modulo. Qui definiamo quale classe sarà il sottoscrittore e aggiungiamo il tag event_subscriber. Ora dobbiamo creare la classe del sottoscrittore:

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])));
    }
  }
 
  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    $events[KernelEvents::REQUEST][] = array('checkForRedirection');
    return $events;
  }
 
}

Analizziamo i punti principali di questo codice. La classe del nostro sottoscrittore implementa l’interfaccia EventSubscriberInterface. Il metodo principale di questa interfaccia è getSubscribedEvents(), che determina a quali eventi il sottoscrittore deve reagire e quali metodi chiamare quando l’evento si verifica. Nel nostro caso, l’evento si verifica all’inizio del ciclo di vita di Drupal, dopo l’elaborazione della richiesta. Qui richiamiamo il metodo checkForRedirection() quando si verifica l’evento. All’interno del metodo, se è presente il parametro redirect-me nell’URL, l’utente viene reindirizzato alla home page.

Questo codice verrà eseguito ogni volta che si carica una pagina — o quasi sempre. Infatti, se la pagina è memorizzata nella cache, Drupal potrebbe restituirla direttamente senza eseguire tutto il codice, poiché la cache avrà la priorità.

In questi casi, puoi utilizzare un equivalente di hook_boot(), che, come hook_init(), è stato rimosso da Drupal 8:

https://www.drupal.org/node/1909596

Aggiungiamo un altro metodo, redirectBeforeWithoutCache():

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])));
    }
  }
 
  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    $events[KernelEvents::REQUEST][] = array('checkForRedirection');
    $events[KernelEvents::REQUEST][] = array('redirectBeforeWithoutCache', 300);
    return $events;
  }
 
}

Nel metodo getSubscribedEvents() abbiamo registrato la risposta allo stesso evento KernelEvents::REQUEST, ma in questo caso abbiamo impostato la priorità su 300. Questo consente al metodo di essere eseguito prima degli altri metodi associati allo stesso evento con priorità inferiore. Ora il reindirizzamento funzionerà anche per le pagine in cache.

In Drupal ci sono molti eventi ai quali è possibile iscriversi tramite un Subscriber. Puoi trovare ulteriori esempi nella documentazione ufficiale:

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