drupal9

Ejecutar código cuando ocurran Eventos en Drupal 9 y 10 (EventSubscriberInterface)

En Drupal 10 podemos ejecutar cierto código al ocurrir ciertos eventos (similar a los hooks) para ello debemos suscribir nuestro código a dichos eventos.

Para Realizar la suscripción de nuestro código a los eventos de Drupal, debemos crear una clase e implementarla con la interface EventSubscriberInterface.

Y luego debemos indecarle a Drupal que dicha clase es también un servicio.

Hagamos todo esto paso a paso:

  1. Para nuestro ejemplo crearemos un módulo llamado redirect_event_subscriber y dentro de él una clase RedirectSubscriber.php que nos haga una redirección al home cuando querramos ver el detalle de un nodo.

    Dicha clase tendrá la siguiente ubicación dentro del módulo:

    redirect_event_subscriber/src/EventSubscriber/RedirectSubscriber.php

  2. El código de la clase tendrá esta estructura:

     

    <?php
    
    namespace Drupal\redirect_event_subscriber\EventSubscriber;
    
    use Symfony\Component\EventDispatcher\EventSubscriberInterface;
    use Symfony\Component\HttpKernel\Event\RequestEvent;
    use Symfony\Component\HttpKernel\KernelEvents;
    
    class RedirectSubscriber implements EventSubscriberInterface {
      public function onKernelRequest(RequestEvent $event) {
    
      }
    
      public static function getSubscribedEvents() {
        return [
          KernelEvents::REQUEST => ['onKernelRequest'],
        ];
      }
    }

     

  3. Como vemos tenemos la clase RedirectSubscriber que implementa a EventSubscriberInterface.
  4. Además tenemos el método getSubscribedEvents()  que viene por la implementación de EventSubscriberInterface y lo que hace es suscribir el método onKernelRequest que tendrá nuestro código personalizado al evento KernelEvents::REQUEST.
  5. KernelEvents::REQUEST es un evento que se dispara justo después de recibir la petición del usuario y antes de procesar dicha petición, y nuestro caso cuando se dispare, entonces ejecutará nuestro método onKernelRequest.
  6. Ahora dentro del método onKernelRequest pondremos el código necesario para hacer el redireccionamiento al home cada vez que intentamos ver el detalle de un nodo.

        $current_route = \Drupal::routeMatch()->getRouteName();
        
        if (strpos($current_route, 'entity.node.canonical') === 0) {
          $url_front = Url::fromRoute('<front>')->toString();
          $response = new RedirectResponse($url_front, 301);
          $event->setResponse($response);
        }

    a. Recuperamos la ruta actual que está visitando el usuario y la asignamos a $current_route.

    \Drupal::routeMatch()->getRouteName()

    b. Luego condicionamos con la posición de entity.node.canonical para que este al principio de la ruta

    strpos($current_route, 'entity.node.canonical') === 0

    c. Luego recuperamos la ruta frontal y hacemos el redireccionamiento al home.

          $url_front = Url::fromRoute('<front>')->toString();
          $response = new RedirectResponse($url_front, 301);
          $event->setResponse($response);

     

  7. Ahora nuestra clase quedó completa y nuestro código debería verse así:

     

    <?php
    
    namespace Drupal\redirect_event_subscriber\EventSubscriber;
    
    use Drupal\Core\Url;
    use Symfony\Component\EventDispatcher\EventSubscriberInterface;
    use Symfony\Component\HttpFoundation\RedirectResponse;
    use Symfony\Component\HttpKernel\Event\RequestEvent;
    use Symfony\Component\HttpKernel\KernelEvents;
    
    class RedirectSubscriber implements EventSubscriberInterface {
      /**
       * Redirige usuarios desde la página de detalle de un nodo a la página de inicio.
       *
       * @param \Symfony\Component\HttpKernel\Event\RequestEvent $event
       *   El objeto de evento que contiene información sobre la solicitud.
       */
      public function onKernelRequest(RequestEvent $event) {
        $current_route = \Drupal::routeMatch()->getRouteName();
        if (strpos($current_route, 'entity.node.canonical') === 0) {
          // Redirect the user to the homepage.
          $url_front = Url::fromRoute('<front>')->toString();
          $response = new RedirectResponse($url_front, 301);
          $event->setResponse($response);
        }
      }
    
      /**
       * Obtiene los eventos a los que se suscribe esta clase.
       *
       * @return array
       *   Un array que mapea nombres de eventos a métodos de manejo de eventos.
       *
       * @see \Symfony\Component\EventDispatcher\EventSubscriberInterface::getSubscribedEvents()
       *   Para más información sobre este método heredado.
       */
    
      public static function getSubscribedEvents() {
        return [
          KernelEvents::REQUEST => ['onKernelRequest'],
        ];
      }
    }
    

     

  8. Lo último que nos faltaría hacer es crear nuestro servicio redirect_event_subscriber.services.yml en la raíz del módulo, el cual se vería así:

    services:
      redirect_event_subscriber.event_subscriber:
        class: Drupal\redirect_event_subscriber\EventSubscriber\RedirectSubscriber
        tags:
          - { name: event_subscriber }

    a. En class definimos la clase que define nuestro servicio.

    b. En { name: event_subscriber }  estamos indicando a Drupal que este servicio implementa la interfaz EventSubscriberInterface y que desea suscribirse a los eventos en el sistema. Cuando etiquetas un servicio con este tag, Drupal automáticamente lo detecta y lo registra como un suscriptor de eventos. Esto significa que los métodos definidos en tu clase de suscriptor de eventos (RouteSubscriber en este caso) serán llamados cuando ocurran los eventos a los que te has suscrito.

  9. Para nuestro ejemplo utilizamos el evento KernelEvents::REQUEST , pero existen otros eventos en Drupal, estos son sólo algunos ejemplos:

    KernelEvents::RESPONSE

    KernelEvents::CONTROLLER

  10. Para otras referencias puede consultar en:

    https://www.drupal.org/docs/develop/creating-modules/subscribe-to-and-dispatch-events

    https://snippets.devbranch.work/snippets/how-create-301-redirect-drupal-10

     

Me pareció interesante el artículo

Deseo más información

O también puedes comunicarte con nosotros.

por whatsapp por whatsapp

Añadir nuevo comentario

Me gustaría más información sobre:

CAPTCHA