HTTP es un protocolo sin estado. Es decir, HTTP en sí mismo no tiene un mecanismo para mantener información de un usuario entre solicitudes.
La funcionalidad de sesión de Laravel ofrece un modo de conservar datos del usuario a lo largo de varias solicitudes.Guarda en la sesión información que quieras mantener entre solicitudes: estado de inicio de sesión, productos del carrito, datos de un formulario en curso, etc.
La configuración se encuentra en config/session.php.
Puedes cambiar el driver con la variable de entorno SESSION_DRIVER (en .env).
SESSION_DRIVER=database
Los drivers que Laravel soporta de serie son:
Driver
Resumen
file
Guarda como archivos en storage/framework/sessions (por defecto)
cookie
Guarda en el navegador como cookies cifradas
database
Guarda en una tabla de la base de datos
redis
Guarda en Redis (rápido)
array
Guarda en un array de PHP (para pruebas; no persiste entre solicitudes)
En un proyecto por defecto de Laravel, el driver configurado es database. Para usar este driver hace falta la tabla sessions, pero ya está incluida en la migración por defecto, así que funciona sin ajustes.
El helper session() puede invocarse desde cualquier sitio: controladores, vistas, etc.
// Obtener un valor$value = session('key');// Obtener con valor por defecto$value = session('key', 'Valor por defecto');// Guardar un valorsession(['key' => 'value']);
En pruebas puedes verificar con assertSessionHas en ambos casos. Dentro de un controlador, usar $request->session() deja explícita la dependencia y resulta más claro.
// Obtener por clave$value = $request->session()->get('key');// Con valor por defecto$value = $request->session()->get('key', 'default');// Valor por defecto mediante un closure$value = $request->session()->get('key', function () { return 'default';});// Obtener todos los datos de la sesión$data = $request->session()->all();
// true si existe y no es nullif ($request->session()->has('user_id')) { // ...}// true si existe aunque sea nullif ($request->session()->exists('user_id')) { // ...}// true si no existeif ($request->session()->missing('user_id')) { // ...}
Presta atención a la diferencia entre has y exists:
// A través de la instancia Request$request->session()->put('user_name', 'Tanaka');// A través del helper globalsession(['user_name' => 'Tanaka']);// Añadir a un array$request->session()->push('cart.items', ['id' => 1, 'name' => 'Producto A']);
// Elimina una clave$request->session()->forget('user_name');// Elimina varias claves de una vez$request->session()->forget(['user_name', 'cart']);// Elimina todos los datos de la sesión$request->session()->flush();
Los datos flash son datos de sesión válidos solo en la siguiente solicitud.
Se usan para información que solo hay que mostrar una vez, como mensajes de éxito o error tras enviar un formulario.
// Extiende todos los datos flash una solicitud más$request->session()->reflash();// Extiende solo ciertas claves$request->session()->keep(['status', 'message']);
Escribir la visualización del mensaje flash en el layout (por ejemplo layouts/app.blade.php) permite mostrarlo de forma consistente en todas las páginas.
En caso de fallo de validación se combina con back()->withErrors().
Laravel guarda automáticamente los errores como datos flash, así que en Blade puedes usar la variable $errors.
public function store(Request $request): RedirectResponse{ $validated = $request->validate([ 'title' => 'required|string|max:255', 'body' => 'required|string', ]); Post::create($validated); // Éxito: redirige con mensaje flash return redirect() ->route('posts.index') ->with('success', 'Post creado.'); // En caso de fallo de validación Laravel ejecuta automáticamente back()->withErrors()->withInput()}
flush() elimina todos los datos de la sesión, incluido el estado de autenticación. Si solo quieres eliminar datos específicos, usa forget() indicando la clave.