Estamos actualizando el sitio. Durante unos días es posible que veas fallos de diseño o de traducción. La documentación sigue disponible: si una página se ve mal, recárgala más tarde.

Inicio Laravel 10.x Sesión HTTP

Sesión HTTP

10.x 7 de mar. de 2026

#Introducción

Dado que las aplicaciones basadas en HTTP son sin estado, las sesiones proporcionan una forma de almacenar información sobre el usuario a través de múltiples solicitudes. Esa información del usuario generalmente se coloca en un almacenamiento persistente o backend al que se puede acceder desde solicitudes posteriores.

Laravel incluye una variedad de backends de sesión que se acceden mediante una API expresiva y unificada. Se incluye soporte para backends populares como Memcached, Redis y bases de datos.

#Configuración

El archivo de configuración de sesión de su aplicación se encuentra en config/session.php. Asegúrese de revisar las opciones disponibles en este archivo. Por defecto, Laravel está configurado para usar el driver de sesión file, que funciona bien para muchas aplicaciones. Si su aplicación estará balanceada entre varios servidores web, debería elegir un almacenamiento centralizado al que todos los servidores puedan acceder, como Redis o una base de datos.

La opción de configuración driver define dónde se almacenarán los datos de sesión para cada solicitud. Laravel incluye varios drivers excelentes listos para usar:

  • file - las sesiones se almacenan en storage/framework/sessions.
  • cookie - las sesiones se almacenan en cookies seguras y cifradas.
  • database - las sesiones se almacenan en una base de datos relacional.
  • memcached / redis - las sesiones se almacenan en uno de estos almacenes rápidos basados en caché.
  • dynamodb - las sesiones se almacenan en AWS DynamoDB.
  • array - las sesiones se almacenan en un array PHP y no se persisten.
Примечание

El driver array se utiliza principalmente durante las pruebas y evita que los datos almacenados en la sesión se persistan.

#Requisitos previos del driver

#Base de datos

Al usar el driver de sesión database, necesitará crear una tabla para contener los registros de sesión. Un ejemplo de declaración Schema para la tabla se muestra a continuación:

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

Schema::create('sessions', function (Blueprint $table) {
    $table->string('id')->primary();
    $table->foreignId('user_id')->nullable()->index();
    $table->string('ip_address', 45)->nullable();
    $table->text('user_agent')->nullable();
    $table->text('payload');
    $table->integer('last_activity')->index();
});

Puede usar el comando Artisan session:table para generar esta migración. Para aprender más sobre migraciones de base de datos, puede consultar la documentación completa de migraciones:

php artisan session:table

php artisan migrate

#Redis

Antes de usar sesiones Redis con Laravel, deberá instalar la extensión PHP PhpRedis vía PECL o instalar el paquete predis/predis (~1.0) vía Composer. Para más información sobre la configuración de Redis, consulte la documentación de Redis de Laravel.

Примечание

En el archivo de configuración session, la opción connection puede usarse para especificar qué conexión Redis será usada por la sesión.

#Interacción con la sesión

#Recuperar datos

Hay dos formas principales de trabajar con datos de sesión en Laravel: el helper global session y a través de una instancia de Request. Primero, veamos cómo acceder a la sesión mediante una instancia de Request, que puede ser tipeada en un closure de ruta o método de controlador. Recuerde que las dependencias de métodos de controlador se inyectan automáticamente mediante el contenedor de servicios de Laravel:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\View\View;

class UserController extends Controller
{
    /**
     * Mostrar el perfil del usuario dado.
     */
    public function show(Request $request, string $id): View
    {
        $value = $request->session()->get('key');

        // ...

        $user = $this->users->find($id);

        return view('user.profile', ['user' => $user]);
    }
}

Al recuperar un ítem de la sesión, también puede pasar un valor por defecto como segundo argumento al método get. Este valor por defecto será retornado si la clave especificada no existe en la sesión. Si pasa un closure como valor por defecto al método get y la clave solicitada no existe, el closure se ejecutará y su resultado será retornado:

$value = $request->session()->get('key', 'default');

$value = $request->session()->get('key', function () {
    return 'default';
});

#El helper global Session

También puede usar la función global PHP session para recuperar y almacenar datos en la sesión. Cuando el helper session es llamado con un solo argumento string, devolverá el valor de esa clave de sesión. Cuando el helper es llamado con un array de pares clave/valor, esos valores se almacenarán en la sesión:

Route::get('/home', function () {
    // Recuperar un dato de la sesión...
    $value = session('key');

    // Especificar un valor por defecto...
    $value = session('key', 'default');

    // Almacenar un dato en la sesión...
    session(['key' => 'value']);
});
Примечание

Hay poca diferencia práctica entre usar la sesión a través de una instancia de solicitud HTTP o usando el helper global session. Ambos métodos son testables mediante el método assertSessionHas disponible en todos sus casos de prueba.

#Recuperar todos los datos de la sesión

Si desea recuperar todos los datos de la sesión, puede usar el método all:

$data = $request->session()->all();

#Recuperar una parte de los datos de la sesión

Los métodos only y except pueden usarse para recuperar un subconjunto de los datos de la sesión:

$data = $request->session()->only(['username', 'email']);

$data = $request->session()->except(['username', 'email']);

#Determinar si un ítem existe en la sesión

Para determinar si un ítem está presente en la sesión, puede usar el método has. El método has devuelve true si el ítem está presente y no es null:

if ($request->session()->has('users')) {
    // ...
}

Para determinar si un ítem está presente en la sesión, incluso si su valor es null, puede usar el método exists:

if ($request->session()->exists('users')) {
    // ...
}

Para determinar si un ítem no está presente en la sesión, puede usar el método missing. El método missing devuelve true si el ítem no está presente:

if ($request->session()->missing('users')) {
    // ...
}

#Almacenar datos

Para almacenar datos en la sesión, normalmente usará el método put de la instancia de solicitud o el helper global session:

// A través de una instancia de solicitud...
$request->session()->put('key', 'value');

// A través del helper global "session"...
session(['key' => 'value']);

#Agregar valores a arrays en la sesión

El método push puede usarse para agregar un nuevo valor a un valor de sesión que sea un array. Por ejemplo, si la clave user.teams contiene un array de nombres de equipos, puede agregar un nuevo valor al array así:

$request->session()->push('user.teams', 'developers');

#Recuperar y eliminar un ítem

El método pull recupera y elimina un ítem de la sesión en una sola instrucción:

$value = $request->session()->pull('key', 'default');

#Incrementar y decrementar valores de sesión

Si sus datos de sesión contienen un entero que desea incrementar o decrementar, puede usar los métodos increment y decrement:

$request->session()->increment('count');

$request->session()->increment('count', $incrementBy = 2);

$request->session()->decrement('count');

$request->session()->decrement('count', $decrementBy = 2);

#Datos flash

A veces puede querer almacenar ítems en la sesión solo para la siguiente solicitud. Puede hacerlo usando el método flash. Los datos almacenados en la sesión con este método estarán disponibles inmediatamente y durante la siguiente solicitud HTTP. Después de esa solicitud, los datos flash serán eliminados. Los datos flash son útiles principalmente para mensajes de estado de corta duración:

$request->session()->flash('status', '¡La tarea fue exitosa!');

Si necesita persistir sus datos flash por varias solicitudes, puede usar el método reflash, que mantendrá todos los datos flash por una solicitud adicional. Si solo necesita conservar datos flash específicos, puede usar el método keep:

$request->session()->reflash();

$request->session()->keep(['username', 'email']);

Para persistir sus datos flash solo para la solicitud actual, puede usar el método now:

$request->session()->now('status', '¡La tarea fue exitosa!');

#Eliminar datos

El método forget eliminará un dato de la sesión. Si desea eliminar todos los datos de la sesión, puede usar el método flush:

// Eliminar una clave...
$request->session()->forget('name');

// Eliminar varias claves...
$request->session()->forget(['name', 'status']);

$request->session()->flush();

#Regenerar el ID de sesión

Regenerar el ID de sesión se hace a menudo para evitar que usuarios malintencionados exploten un ataque de fijación de sesión en su aplicación.

Laravel regenera automáticamente el ID de sesión durante la autenticación si está usando uno de los starter kits de Laravel o Laravel Fortify; sin embargo, si necesita regenerar manualmente el ID de sesión, puede usar el método regenerate:

$request->session()->regenerate();

Si necesita regenerar el ID de sesión y eliminar todos los datos de la sesión en una sola instrucción, puede usar el método invalidate:

$request->session()->invalidate();

#Bloqueo de sesión

Внимание

Para utilizar el bloqueo de sesión, su aplicación debe usar un driver de caché que soporte locks atómicos. Actualmente, esos drivers incluyen memcached, dynamodb, redis, database, file y array. Además, no puede usar el driver de sesión cookie.

Por defecto, Laravel permite que las solicitudes que usan la misma sesión se ejecuten concurrentemente. Por ejemplo, si usa una librería HTTP de JavaScript para hacer dos solicitudes HTTP a su aplicación, ambas se ejecutarán al mismo tiempo. Para muchas aplicaciones esto no es un problema; sin embargo, puede ocurrir pérdida de datos de sesión en un pequeño subconjunto de aplicaciones que hacen solicitudes concurrentes a dos endpoints diferentes que escriben datos en la sesión.

Para mitigar esto, Laravel ofrece funcionalidad que permite limitar las solicitudes concurrentes para una sesión dada. Para comenzar, simplemente puede encadenar el método block en la definición de su ruta. En este ejemplo, una solicitud entrante al endpoint /profile adquirirá un bloqueo de sesión. Mientras este bloqueo esté activo, cualquier solicitud entrante a los endpoints /profile o /order que compartan el mismo ID de sesión esperará a que la primera solicitud termine antes de continuar su ejecución:

Route::post('/profile', function () {
    // ...
})->block($lockSeconds = 10, $waitSeconds = 10)

Route::post('/order', function () {
    // ...
})->block($lockSeconds = 10, $waitSeconds = 10)

El método block acepta dos argumentos opcionales. El primer argumento aceptado por el método block es el número máximo de segundos durante los cuales debe mantenerse el bloqueo de la sesión antes de que se libere. Por supuesto, si la solicitud termina de ejecutarse antes de ese tiempo, el bloqueo se liberará antes.

El segundo argumento aceptado por el método block es el número de segundos que una solicitud debe esperar mientras intenta obtener un bloqueo de sesión. Se lanzará una Illuminate\Contracts\Cache\LockTimeoutException si la solicitud no puede obtener un bloqueo de sesión dentro del número de segundos indicado.

Si no se pasan estos argumentos, el bloqueo se obtendrá por un máximo de 10 segundos y las solicitudes esperarán un máximo de 10 segundos intentando obtener el bloqueo:

Route::post('/profile', function () {
    // ...
})->block()

#Agregar drivers de sesión personalizados

#Implementar el driver

Si ninguno de los drivers de sesión existentes se ajusta a las necesidades de su aplicación, Laravel permite escribir su propio manejador de sesión. Su driver personalizado debe implementar la interfaz PHP incorporada SessionHandlerInterface. Esta interfaz contiene solo unos pocos métodos simples. Una implementación básica para MongoDB se ve así:

<?php

namespace App\Extensions;

class MongoSessionHandler implements \SessionHandlerInterface
{
    public function open($savePath, $sessionName) {}
    public function close() {}
    public function read($sessionId) {}
    public function write($sessionId, $data) {}
    public function destroy($sessionId) {}
    public function gc($lifetime) {}
}
Примечание

Laravel no incluye un directorio específico para contener sus extensiones. Usted es libre de ubicarlas donde prefiera. En este ejemplo, hemos creado un directorio Extensions para alojar el MongoSessionHandler.

Dado que el propósito de estos métodos no es inmediatamente claro, repasemos rápidamente qué hace cada uno:

  • El método open se usa típicamente en sistemas de almacenamiento de sesión basados en archivos. Como Laravel incluye un driver de sesión file, rara vez necesitará poner algo en este método. Puede dejarlo vacío.
  • El método close, al igual que open, generalmente puede ser ignorado. Para la mayoría de los drivers, no es necesario.
  • El método read debe devolver la versión en string de los datos de sesión asociados con el $sessionId dado. No es necesario hacer serialización u otro tipo de codificación al recuperar o almacenar datos de sesión en su driver, ya que Laravel se encargará de la serialización.
  • El método write debe escribir el string $data dado asociado con el $sessionId en algún sistema de almacenamiento persistente, como MongoDB u otro sistema de su elección. Nuevamente, no debe realizar serialización, Laravel ya la habrá manejado.
  • El método destroy debe eliminar los datos asociados con el $sessionId del almacenamiento persistente.
  • El método gc debe destruir todos los datos de sesión que sean más antiguos que el $lifetime dado, que es un timestamp UNIX. Para sistemas con expiración automática como Memcached y Redis, este método puede dejarse vacío.

#Registrar el driver

Una vez que su driver ha sido implementado, está listo para registrarlo con Laravel. Para agregar drivers adicionales al backend de sesión de Laravel, puede usar el método extend proporcionado por la facade Session. Debe llamar al método extend desde el método boot de un service provider. Puede hacerlo desde el App\Providers\AppServiceProvider existente o crear un proveedor completamente nuevo:

<?php

namespace App\Providers;

use App\Extensions\MongoSessionHandler;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\ServiceProvider;

class SessionServiceProvider extends ServiceProvider
{
    /**
     * Registrar servicios de la aplicación.
     */
    public function register(): void
    {
        // ...
    }

    /**
     * Inicializar servicios de la aplicación.
     */
    public function boot(): void
    {
        Session::extend('mongo', function (Application $app) {
            // Retornar una implementación de SessionHandlerInterface...
            return new MongoSessionHandler;
        });
    }
}

Una vez que el driver de sesión ha sido registrado, puede usar el driver mongo en su archivo de configuración config/session.php.