Almacenamiento de datos temporal (Tempstore) en Drupal 8

Imagen
Cañon de arizona

En artículos anteriores hemos hablado de State API, el cual nos servia para almacenar información estática sobre nuestro sitio web. Ahora vamos a ver una de las nuevas opciones que tenemos en Drupal 8 para almacenar información de manera temporal. Se trata de TempStore y nos permite almacenar durante un tiempo cierta información.

Que es TempStore:

La idea principal de TempStore es la de compartir información a través de múltiples sesiones de usuario. Es algo parecido al uso del array $_SESSION de php, pero esta vez se almacena en la base de datos, concretamente en la tabla "key_value_expire".

Dentro de la API de TempStore, tenemos 2 servicios diferentes, tempstore.private y tempstore.shared. su funcionalidad básica es la misma, almacenar información de manera temporal, pero uno se utiliza por usuario (el privado), y el otro permite compartir información entre usuarios (shared).

Por ejemplo, podemos utilizar el almacenamiento privado, cuando un usuario esta rellenando un formulario con múltiples pasos, asi podremos guardar la información de cada paso. Y el compartido, para bloquear un contenido cuando un usuario lo esta editando, y evitar que 2 usuarios modifiquen el mismo contenido al mismo tiempo.

Private TempStore:

Primero vamos a ver la opción privada, esta almacena información por cada usuario de manera individual, su uso es básicamente el mismo que otras API de almacenamientos como la de State que se ha mencionado al inicio.

/** @var PrivateTempStoreFactory $factory */
$factory = \Drupal::service('tempstore.private');
$store = $factory->get('mi_modulo.mi_coleccion');
$store->set('neko_clave', 'valor');
$value = $store->get('neko_clave');
$store->delete('neko_clave');

Primero tenemos que obtener el servicio, y a continuación la colección donde se almacenaran los datos. Una vez tenemos la colección, ya podemos almacenar datos con los métodos get y set típicos, ademas podemos borrarlos con el método delete.

Cuidado con los usuarios anónimos:

Si vamos a usar el almacenamiento temporal privado con usuarios anónimo, tenemos que indicarle a Drupal que mantenga la sesión, para ello podemos utilizar el siguiente código:

if (\Drupal::currentUser()->isAnonymous()) {
  $_SESSION['hold_session'] = true;
}

De esta manera Drupal sabrá que tiene que mantener la sesión de los usuarios anónimos. Esto es debido, a que cuando almacenamos una clave para anónimos, esta se almacena con la ID de la sesión, y siendo anónimos, pues esta cambia de manera constante, a si que cuando queramos obtener el valor, seguramente no tengamos nada y debemos indicarle a Drupal que mantenga la sesión.

Shared TempStore:

Utilizar el almacenamiento temporal compartido es idéntico al privado, pero tenemos que utilizar un servicio distinto, por lo demás su uso es idéntico aunque internamente cambie como almacena la información.

/** @var SharedTempStoreFactory $factory */
$factory = \Drupal::service('tempstore.shared');
$store = $factory->get('mi_modulo.mi_coleccion');
$store->set('neko_clave', 'valor');
$value = $store->get('neko_clave');
$store->delete('neko_clave');

Mucho mas no queda por explicar, esta vez no tenemos que preocuparnos por los usuarios anónimos, ya que esta vez todos los usuarios comparten los mismos datos.

Tenemos otras opciones como almacenar un valor si previamente no existe con el método ->setIfNotExists('neko_clave', 'valor')".

Tiempo de expiración:

Después de ver esta API para almacenar datos de manera temporal, nos podemos preguntar: "¿Pero cuanto tiempo almacena la información?". Si no modificamos nada, por defecto durante 7 días, modificar este valor es sencillo.

Tenemos que tener el archivo services.yml en /sites/default/services.yml, si no tenemos este archivo, podemos copiar el archivo /sites/default/default.services.yml y modificar el valor tempstore.expire al valor que queramos, por defecto esta en 604800 segundos, que equivale a 7 días.

Tempstore modificacion parametro

Si el valor no existe, lo podemos añadir, al ser formato yml, tenemos que añadirle tabulación para que entienda que pertenece a "parameters".

Conclusión:

TempStore puede sernos muy útil para almacenar datos de manera temporal para los usuarios. Son 2 servicios sencillos, pero muy útiles si necesitamos algún tipo de almacenamiento relacionado con sesiones.