Aprende a crear COOKIES PERSONALIZADAS en Drupal 10

cookies

    Vamos a explorar cómo podemos usar un EventSubscriber para establecer una cookie personalizada cada vez que nuestro sitio genera una respuesta. Y no, no estamos hablando de las galletas que comes, sino de pequeños paquetes de datos que se almacenan en el navegador del usuario.

¿Por qué un EventSubscriber?

    Un EventSubscriber en Drupal (y en Symfony) permanece en segundo plano hasta que se desencadena un evento específico, en este caso, el evento RESPONSE que ocurre justo antes de que Drupal envíe una respuesta al navegador del usuario. Usar un suscriptor de eventos nos permite inyectar nuestra lógica personalizada en este punto crucial.

Preparativos Iniciales

    En nuestro escenario, vamos a configurar una cookie personalizada con el nombre del usuario autenticado. Para hacer esto de una manera ordenada y modular, vamos a comenzar con el siguiente bloque de código:

<?php
namespace Drupal\my_module\EventSubscriber;
use Drupal\Core\Session\AccountProxyInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

    Espacio de Nombres (namespace): Drupal\custom_module\EventSubscriber, un identificador único que nos permite organizar nuestro código y evitar conflictos de nombres.

    Clases Importadas (use): Importamos las clases necesarias que nos ayudarán a interactuar con el sistema y manipular la respuesta.

Cocinando con el Event Subscriber

    Vamos a definir nuestra clase UserNameSubscriber que implementa EventSubscriberInterface. Esta interfaz nos exige definir un método getSubscribedEvents, donde especificamos qué evento nos interesa y qué método debe ser llamado cuando se desencadena ese evento.

public static function getSubscribedEvents() {
  return [
    KernelEvents::RESPONSE => 'setCustomCookie',
  ];
}

Hornear la Cookie

    Ahora, en el método setCustomCookie, vamos a verificar si el usuario está autenticado. Si es así, configuramos una cookie con su nombre de usuario. Veamos cómo se hace esto:

public function setCustomCookie(ResponseEvent $event) {
  if ($this->currentUser->isAuthenticated()) {
    $username = $this->currentUser->getDisplayName();
    $response = $event->getResponse();
    $cookie = new Cookie(
      'drupal_user',        // Cookie name
      $username,            // Cookie value
      strtotime('+1 year'), // Expiry time
      '/',                  // Path
      NULL,                 // Domain
      FALSE,                // Secure
      FALSE,                // HTTP only
      FALSE,                // HttpOnly
      'lax'                 // SameSite
    );
    $response->headers->setCookie($cookie);
  }
}

    Cada parámetro en la creación de la cookie tiene su propósito, similar a cómo cada ingrediente en una receta contribuye al sabor final del plato:

  • Cookie name ('drupal_user'): La forma de llamarla cuando la necesitas.
  • Cookie value ($username): El contenido real de la cookie, en este caso, el nombre del usuario.
  • Expiry time (strtotime('+1 year')): Al igual que la leche, las cookies tienen una fecha de caducidad.
  • Path ('/'): Define dónde en tu sitio será accesible la cookie. '/' significa en todo el sitio.
  • Domain (NULL): Si quieres que tu cookie esté disponible en subdominios, aquí es donde lo especificarías.
  • Secure (FALSE): TRUE significa que la cookie sólo se envía sobre HTTPS.
  • HTTP only (FALSE): Si es TRUE, tu cookie estará a salvo de los scripts del lado del cliente, por lo tanto si quieres usarla con JavaScript, esta es la opción a tener en cuenta.
  • HttpOnly (FALSE): Similar al anterior, pero con un nivel extra de seguridad contra ciertos tipos de ataques.
  • SameSite ('lax'): Un atributo que ayuda a mitigar el riesgo de ataques de tipo CSRF.

    Con el código anterior, hemos creado un EventSubscriber que se activará con cada respuesta generada por nuestro sitio, configurando una cookie personalizada con el nombre de usuario. Este es sólo un ejemplo de cómo puedes usar los suscriptores de eventos en Drupal para personalizar el comportamiento de tu sitio y hacerlo aún más interactivo y dinámico.

Comparte este artículo:
Publicado por CésarMSFelipe
Image

Hola a todos, soy desarrollador de Drupal, especializado en Backend, aunque a veces hago mis pinitos con Frontend, ¡Hasta sé centrar un div! Cuando no estoy sumergido en el código, probablemente me encontraréis explorando nuevos mundos en mis videojuegos favoritos o disfrutando de tiempo de calidad con los míos. Me apasiona combinar la tecnología con la creatividad, y siempre estoy buscando nuevas formas de aprender y crecer en mi campo. ¿Unimos fuerzas y creamos algo?