Una vistazo profundo a las sesiones en Laravel

  • Publicado el 30 septiembre, 2024
  • Palabras: 1578

Al crear aplicaciones Laravel, es casi seguro que necesitarás trabajar con sesiones en algún momento. Son una parte fundamental del desarrollo web. En este artículo, cubriremos rápidamente qué son las sesiones, cómo funcionan en Laravel y cómo puedes trabajar con ellas en tus aplicaciones Laravel.

Una vistazo profundo a las sesiones en Laravel

#¿Qué son las sesiones?

 

De manera predeterminada, las aplicaciones web no tienen estado, lo que significa que las solicitudes generalmente no se conocen entre sí. Por lo tanto, necesitamos una forma de almacenar datos entre las solicitudes. Por ejemplo, cuando un usuario inicia sesión en un sitio web, debemos recordar que ha iniciado sesión durante toda su visita. Aquí es donde entran en juego las sesiones.

 

En pocas palabras, las sesiones son una forma segura de conservar datos en varias solicitudes.

 

Los datos de la sesión se pueden usar para almacenar cosas como:

 

  • Estado de autenticación del usuario.
  • Datos temporales a los que se puede acceder en otra página.
  • Mensajes Flash que se muestran al usuario.


Los datos de la sesión se pueden almacenar en una variedad de lugares, como:

 

  • Cookies
  • Bases de datos
  • Almacenes de caché (como Redis)

 

#¿Cómo funcionan las sesiones en Laravel?

 

Para entender qué son las sesiones, veamos cómo funcionan en Laravel.

 

A continuación, se muestran algunos datos de ejemplo que puede encontrar dentro de una sesión en una aplicación de Laravel:

 

[
  '_token' => 'bKmSfoegonZLeIe8B6TWvSm1dKwftKsvcT40xaaW'
  '_previous' => [
    'url' => 'https://my-app.com/users'
  ]
  '_flash' => [
    'old' => [
        'success',
    ],
    'new' => []
  ]
  'success' => 'User created successfully.'
  'current_team_id' => 123
]

 

Analicemos qué puede representar cada una de estas claves.

 

El framework de Laravel agregó las siguientes claves:

 

  • El valor _token se usa para proteger contra ataques CSRF.
  • El valor _previous.url se usa para almacenar la URL de la solicitud anterior.
  • El valor _flash.old se usa para almacenar las claves de los datos de sesión flasheados de la solicitud anterior. En este caso, indica que el valor success se flasheó en la solicitud anterior.
  • El valor _flash.new se usa para almacenar las claves de los datos de sesión flasheados para la solicitud actual.


Las siguientes claves las agregué yo:

 

  • El valor success se usa para almacenar un mensaje de éxito que se puede mostrar al usuario.
  • El valor current_team_id se usa para almacenar el ID del equipo actual que está viendo el usuario.


De manera predeterminada, Laravel admite los siguientes controladores de sesión:

 

  • cookie: los datos de la sesión se almacenan en cookies seguras y encriptadas.
  • base de datos: las sesiones se almacenan en su base de datos (como MySQL, PostgreSQL, SQLite).
  • memcached / redis: los datos de las sesiones se almacenan en estos almacenes de caché rápidos.
  • dynamodb: los datos de las sesiones se almacenan en AWS DynamoDB.
  • file: los datos de las sesiones se almacenan en storage/framework/sessions.
  • array: los datos de las sesiones se almacenan en una matriz PHP en memoria y no se conservarán.


Algunos de estos controladores tienen requisitos de configuración. Por lo tanto, es importante consultar la documentación de Laravel para ver cómo configurarlos antes de usarlos.

 

#Trabajar con sesiones en Laravel

 

Laravel hace que trabajar con sesiones sea agradable y sencillo. La documentación explica muy bien cómo interactuar con las sesiones, pero repasemos rápidamente los conceptos básicos.

 

Para nuestros ejemplos, asumiremos que estamos creando un asistente paso a paso que abarca varias páginas. Almacenaremos el paso actual y los datos ingresados ​​en cada paso de la sesión. De esta manera, podemos leer todos los datos enviados al final del asistente cuando el usuario haya completado todos los pasos.

 

Para simplificar los ejemplos, también usaremos la función auxiliar session(), pero analizaremos el acceso a los datos de la sesión mediante la fachada Session o una clase de solicitud más adelante.

 

#Leyendo los datos de la sesión

 

Para leer datos de la sesión, puede utilizar el método get de la siguiente manera:

 

$currentStep = session()->get(key: 'wizard:current_step');

 

Al ejecutar el código anterior, se devolverá el valor almacenado en la sesión para la clave wizard:current_step. Si no hay ningún valor almacenado en la sesión para esa clave, se devolverá un valor nulo.

 

Este método también le permite definir un valor predeterminado para devolver si la clave no existe:

 

$currentStep = session()->get(key: 'wizard:current_step', default: 1);

 

Al ejecutar el código anterior, se devolverá el valor almacenado en la sesión para la clave wizard:current_step. Si no hay ningún valor almacenado en la sesión para esa clave, se devolverá 1.

 

También puede haber ocasiones en las que desee leer los datos de la sesión y eliminarlos al mismo tiempo (para que no se pueda acceder a ellos nuevamente). Puede utilizar la función pull para esto:

 

$currentStep = session()->pull(key: 'wizard:current_step');

 

Al ejecutar el código anterior se devolvería el valor almacenado en la sesión para la clave wizard:current_step y luego se eliminaría de la sesión.

 

#Escritura de datos en la sesión

 

Para escribir datos en la sesión, puede utilizar la función put de la siguiente manera:

 

session()->put(
    key: 'wizard:step_one:form_data',
    value: [
        'name' => 'Ash Allen',
        'email' => 'ash@example.com',
    ],
);

 

Al ejecutar el código anterior se almacenaría la matriz (pasada en el segundo argumento) como el valor de la clave wizard:step_one:form_data.

 

#Introducir datos en una array en la sesión

 

De manera similar, también puedes enviar datos a una matriz en la sesión usando el método push:

 

session()->push(
    key: 'wizard:step_one:form_data:languages',
    value: 'javascript',
);

 

Suponiendo que la clave wizard:step_one:form_data:languages ​​tenía los siguientes datos:

 

[
    'php',
]

 

El código anterior (que llama al método push) actualizaría el valor de la sesión a:

 

[
    'php',
    'javascript',
]

 

Si el valor wizard:step_one:form_data:languages ​​aún no existía en la sesión, el uso de push crearía la clave de sesión y establecería el valor en una matriz con el valor que usted ingresó.

 

#Incremento y decremento de datos en la sesión

 

Laravel también ofrece algunos métodos auxiliares prácticos que te permiten incrementar y decrementar valores en la sesión:

 

Puedes incrementar un valor en la sesión de la siguiente manera:

 

session()->increment(key: 'wizard:current_step');

 

Cuando ejecutamos el código anterior, si el valor de la sesión wizard:current_step era 3, ahora se incrementará a 4.

 

También puedes disminuir un valor en la sesión de la siguiente manera:

 

session()->decrement(key: 'wizard:current_step');

 

Si los valores aún no existen en la sesión, se tratarán como si fueran 0. Por lo tanto, al llamar a increment en un valor de sesión vacío, se establecerá el valor en 1. Al llamar a decrement en un valor de sesión vacío, se establecerá el valor en -1.

 

Ambos métodos también le permiten especificar la cantidad a incrementar o decrementar:

 

session()->increment(key: 'wizard:current_step', amount: 2);
session()->decrement(key: 'wizard:current_step', amount: 2);

 

#Eliminar datos de la sesión

 

También puedes eliminar datos de la sesión utilizando los métodos de olvido:

 

session()->forget(keys: 'wizard:current_step');

 

Al ejecutar el código anterior, se eliminarán los datos pertenecientes a la clave wizard:current_step de la sesión.

 

Si desea eliminar varias claves a la vez, puede pasar una matriz de claves a la función forget:

 

session()->forget(keys: [
    'wizard:current_step',
    'wizard:step_one:form_data',
]);

 

O, si prefieres eliminar todos los datos de la sesión, puedes utilizar la función flush:

 

session()->flush();

 

#Cómo comprobar si existen datos en la sesión

 

Laravel también ofrece algunas funciones auxiliares útiles para comprobar si existen datos en la sesión.

 

Puede utilizar el método has para comprobar si existe una clave en la sesión y si su valor no es nulo:

 

session()->has(key: 'wizard:current_step');

 

Si el valor existe y no es nulo, el código anterior devolverá verdadero. Si el valor es nulo o la clave no existe, devolverá falso.

 

De manera similar, también puede usar el método exist para verificar si existe una clave en la sesión (independientemente de si el valor es nulo):

 

session()->exists(key: 'wizard:current_step');

 

También puedes comprobar si la sesión no existe en absoluto en la sesión:

 

session()->missing(key: 'wizard:current_step');

 

#Envío de datos a la sesión

 

Es posible que haya ocasiones en las que desee conservar algunos datos en la sesión, pero solo para la próxima solicitud. Por ejemplo, es posible que desee mostrar una notificación de éxito al usuario después de que haya enviado un formulario.

 

Para ello, puede utilizar el método flash:

 

session()->flash(
    key: 'success',
    value: 'Your form has been submitted successfully!',
);

 

Si ejecutara el código anterior, en la próxima solicitud, podría leer el valor de la sesión (usando algo como session()->get('success')) para mostrarlo. Luego, se eliminaría para que no esté disponible en la próxima solicitud.

 

Puede haber ocasiones en las que tenga algunos datos flasheados (que se agregaron en la solicitud anterior) y desee conservarlos para la próxima solicitud.

 

Puede actualizar todos los datos flasheados usando el método reflash:

 

session()->reflash();

 

O bien, si solo desea conservar algunos de los datos flasheados, puede utilizar el método keep:

 

session()->keep(keys: [
    'success',
    'error',
]);

 

Al ejecutar el código anterior se conservarán los valores de sesión actualizados de éxito y error, pero se eliminarán todos los demás datos actualizados para la próxima solicitud.

 

#¿Helper, Facade, o la Clase Request?

 

Hasta ahora, solo hemos utilizado el asistente session() en nuestros ejemplos.

 

Pero también puedes interactuar con sesiones utilizando el Facade IlluminateSupportFacadesSession o la clase IlluminateHttpRequest.

 

Independientemente de cuál de estos enfoques utilices, podrás seguir utilizando los mismos métodos que hemos tratado anteriormente en este artículo. Estos enfoques son simplemente formas diferentes de interactuar con los datos de la sesión.

 

Para utilizar el Facade Session, puedes llamar a los métodos de la siguiente manera:

 

use IlluminateSupportFacadesSession;
 
Session::get('key');
Session::put('key', 'value');
Session::forget('key');

 

Como alternativa, puede acceder a la sesión llamando al método de sesión en la instancia IlluminateHttpRequest que se inyecta en los métodos del controlador. Supongamos que tiene un método de controlador como el siguiente:

 

use AppHttpControllersController;
use IlluminateHttpRequest;
 
class WizardController extends Controller
{
    public function store(Request $request)
    {
        $request->session()->get('key');
        $request->session()->put('key', 'value');
        $request->session()->forget('key');
 
        // The rest of the method...
    }
}

 

Cada uno de estos enfoques es totalmente válido, por lo que depende de usted decidir cuál prefiere usted y su equipo.

Antonio Jenaro

Antonio Jenaro

Web Developer

Archivado en:

Fuente: Laravel news

Inicia la conversación

Hazte miembro de Antonio Jenaro para comenzar a comentar.

Regístrate ahora

¿Ya estás registrado? Inicia sesión