Cómo trabajar con sesiones, almacenar variables de sesión, recuperarlas, etc. en el framework PHP Laravel con request y el helper global session.
Las variables de sesión son una de las principales herramientas que tenemos, en el desarrollo web del lado del servidor, para almacenar datos que perduren a lo largo de las distintas request o solicitudes realizadas durante la visita a un sitio.
Son muy útiles porque en el protocolo HTTP no es consciente de por sí que varias solicitudes forman parte de la misma visita de un usuario. Gracias a las variables de sesión, el servidor es capaz de relacionar una request con otra y almacenar datos a lo largo de ella.
A diferencia de la persistencia por base de datos, las variables de sesión son pereceredas, de modo que desaparecen cuando pasa un tiempo sin realizarse una nueva solicitud por ese mismo navegador. Pero aún con esta volatilidad es muy útil para realizar cosas como, por ejemplo, almacenar los productos que se insertan en un carrito de la compra.
PHP ya tiene un manejo de las variables de sesión digamos "nativo". Sin embargo, es un poco rígido. Laravel propone unos mecanismos diferentes, a un nivel un poco más alto, y con posibilidades de configuración más detallada. En este artículo daremos unas guías esenciales para poder usar las sesiones en Laravel, aunque siempre es interesante tener presente la documentación de la versión que estás usando en tu caso. Nosotros estamos ahora en Laravel 5.8.
Configuración del sistema de sesión
La configuración del sistema HTTP Session se realiza en el archivo config/session.php. Es aquí donde decimos cuál es el soporte donde se van a almacenar las sesiones, por cuánto tiempo, etc.
Como decíamos, la principal novedad del sistema de sesiones de Laravel con respecto a PHP nativo es la facilidad con la que podemos alterar el funcionamiento interno de las sesiones, para definir un soporte de almacenamiento diverso. Las opciones principales son las siguientes:
- file - Las variables de sesión se almacenan en ficheros, sobre la ruta: storage/framework/sessions.
- cookie - Las variables de sesión son almacenadas en cookies en el navegador, debidamente encriptadas.
- database - Las sesiones son implementadas en la base de datos. Atención, pues esta configuración requiere que se ejecuten ciertas migraciones para disponer de las tablas de almacenamiento.
- memcached / redis - Este soporte permite usar un sistema de caché en memoria, más rápido que otras alternativas.
El archivo de configuración de las sesiones está bastante bien auto-explicado. Un vistazo rápido te permitirá configurar el sistema de sesiones. De manera predeterminada Laravel usa el sistema de archivos. Es importante que leas la documentación con atención si quieres cambiar este soporte, para conocer los requisitos de aquel que desees configurar.
Mecanismos para el acceso al sistema de sesión de Laravel
A diferencia de cuando trabajamos directamente con las sesiones PHP, Laravel se ocupa de diversas operativas administrativas, como abrir la sesión al ejecutarse una solicitud. Por ello, podemos usar las variables de sesión en el momento que deseemos.
Para comenzar debes saber que existen dos alternativas para acceder a las funciones necesarias para trabajo con la sesión.
Helper global session
Este helper te permite acceder al API para el acceso a la sesión desde cualquier parte de tu código, incluso desde las vistas si fuera necesario. Es la manera más cómoda para acceder a los datos de la sesión, modificarlos, etc.
Por ejemplo, así podemos acceder a una variable de sesión llamada "idCarrito".
$identificador_carrito = session('idCarrito');
Una instancia de Request
A partir del objeto Request de Laravel podemos también acceder al API de las sesiones. Esta alternativa requiere por tanto disponer de un objeto $request, del que ya hemos hablado en otras ocasiones en el Manual de Laravel. Este objeto por ejemplo puede venir inyectado en un método de un controlador.
Este sería el código de un método de un controlador. Puedes observar cómo se declara la inyección del objeto $request como parámetro. Una vez tenemos la request, podemos obtener una variable de sesión "idCarrito" de esta manera.
public function index(Request $request) {
$identificador_carrito = $request->session()->get('idCarrito');
// Resto del código de tu controlador...
}
Sólo debes tener en cuenta que los mecanismos para el acceso a los datos de la sesión cambian un poco de uno a otro modelo de trabajo. Nosotros en lo sucesivo vamos a mostrar código accediendo al helper global, ya que es más universal y lo puedes usar sin ceremonia alguna desde cualquier parte de tu aplicación.
Crear y recuperar variables de sesión con Laravel
Ahora veamos distintas operativas que se pueden hacer con las sesiones, con la modalidad de trabajo permitida por el helper session.
Almacenar una variable de sesión
Simplemente le indicamos en un array asociativo qué variables de sesión deseamos almacenar. Este array contiene pares clave/valor. La clave indica el nombre de la variable y el valor, su valor.
session(['idCarrito' => '123456']);
Recuperar una variable de sesión
El helper nos permite de una manera muy cómoda recuperar un dato almacenado en la sesión, indicando simplemente qué nombre de variable deseamos acceder.
$valor_almacenado = session('idCarrito');
Objeto session
Algunas operativas de la sesión se realizan accediendo a un objeto "session", a partir del cual tenemos acceso a varios métodos de utilidad.
El objeto session lo obtenemos ejecutando el helper global sin enviarle ningún parámetro.
session()
A menudo ese objeto de sesión se usa sin necesidad de almacenarlo en ninguna variable, enganchando directamente el método que quieras ejecutar. Por ejemplo uno de los siguientes.
Borrar una variable de sesión
Mediante el objeto de session podemos decirle a Laravel que borre una variable de sesión. Usamos para ello el método forget(), de este modo:
session()->forget('orderId');
Comprobar la existencia de una variable de sesión
A veces es necesario saber si existe en el sistema de sesiones de Laravel una variable determinada. Para ello usamos el método has().
session()->has('paymentIntentId');
Regenerar el identificador de sesión
El identificador de la sesión permite a Laravel, y a nosotros mismos, identificar una sesión de un usuario en la página.
Cada sesión tiene su identificador, que se mantiene a lo largo de toda la visita. Sin embargo, cuando un usuario se loguea en el sistema, con sus datos de usuario, este identificador se regenera automáticamente.
Esta es una funcionalidad predeterminada en Laravel, pero si por cualquier motivo necesitas regenerarlo de manera manual, también puedes hacerlo a partir del método regenerate().
session()->regenerate();
Borrar los datos de sesión al hacer logout
Aunque al hacer un logout podríamos suponer que los datos de la sesión deberían borrarse, este no es un comportamiento predeterminado en Laravel, al menos no en todas las versiones.
Si no queremos modificar a mano el sistema de login ya implementado por Laravel, podemos realizar una sencilla operativa, que consiste básicamente en generar un manejador de evento para "Logout".
Esto se declara en el archivo app/Providers/EventServiceProvider.php
mediante el array $listeners
.
protected $listen = [
'Illuminate\Auth\Events\Logout' => [
'App\Listeners\DeleteSessionData',
],
];
Mediante el código anterior estamos indicando que cuando se dispare el evento "Logout", se invoque el manejador DeleteSessionData.
Ese manejador se puede auto-generar gracias a un comando de Artisan. Ese comando de generación lo tienes que ejecutar después de haber editado el EventServiceProvider.php y se encarga de crear el scaffolding de todas las clases necesarias que se estén usando para gestionar eventos.
php artisan event:generate
La clase DeleteSessionData, una vez generada y editada, tendrá un código como este:
<?php
namespace App\Listeners;
use Illuminate\Auth\Events\Logout;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Lib\StripeHelper;
class DeleteSessionData
{
public function __construct()
{
//
}
public function handle(Logout $event)
{
session()->forget('variable_de_sesion_que_quieres_asegurarte_de_borrar');
}
}
Conclusión
Hemos visto hasta ahora una buena parte de las utilidades y funciones del sistema de sesiones de Laravel. Inclusive hemos podido conocer alguna cosa extra que no está explicada, como la posibilidad de eliminar ciertas variables de sesión sensibles, que no queremos que se sigan conociendo después de haber hecho un logout por parte del usuario.
Sin embargo, el framework Laravel tiene otras muchas utilidades para el trabajo con sesiones. Te recomendamos siempre estudiar la documentación para obtener más información sobre todas estas cosas. Recuerda seguir aprendiendo también en el Manual de Laravel.
Miguel Angel Alvarez
Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...