Cómo guardar una cookie

Desde un controlador se pueden leer cookies usando el objeto Request (con $this->request()) y guardar o borrar cookies usando el objeto Response (con $this->response()).

request() es un método público, pero response() es un método protegido del controlador: las cookies solo se pueden guardar o borrar desde dentro del propio controlador (por ejemplo en execPreviousAction), no desde un modelo u otra clase.

Leer una cookie

$valor = $this->request()->cookie('nombre_cookie');

También se puede indicar un valor por defecto si la cookie no existe:

$valor = $this->request()->cookie('nombre_cookie', 'valor_por_defecto');

El método devuelve el valor de la cookie como string o null si no existe y no se ha indicado valor por defecto.

Guardar una cookie

$this->response()->cookie('nombre_cookie', 'valor');

Por defecto, FacturaScripts usa el tiempo de expiración configurado en cookies_expire (un año, 31536000 segundos, salvo que se haya cambiado en la configuración).

Si queremos indicar una fecha de expiración concreta, debemos pasar un timestamp:

$expire = time() + 3600; // 1 hora
$this->response()->cookie('nombre_cookie', 'valor', $expire);

La firma del método es:

$this->response()->cookie(
    string $name,
    ?string $value,
    int $expire = 0,
    bool $httpOnly = true,
    ?bool $secure = null,
    string $sameSite = 'Lax'
);

Parámetros principales:

  • $name: nombre de la cookie.
  • $value: valor de la cookie.
  • $expire: timestamp de expiración. Si es 0, se usa la configuración cookies_expire.
  • $httpOnly: si es true, la cookie no será accesible desde JavaScript.
  • $secure: si es null, se detecta automáticamente si la petición usa HTTPS.
  • $sameSite: política SameSite. Admite Lax (por defecto), Strict o None. Si usas None, los navegadores exigen además que $secure sea true.

Las cookies se envían sobre la ruta configurada en FS_ROUTE, de modo que siguen funcionando cuando FacturaScripts está instalado en un subdirectorio.

Borrar una cookie

$this->response()->withoutCookie('nombre_cookie');

Internamente reescribe la cookie con un valor vacío y una fecha de expiración en el pasado, por lo que debe llamarse antes de que se envíe la respuesta.

Ejemplo completo

protected function execPreviousAction($action)
{
    // leer cookie
    $modo = $this->request()->cookie('mi_modo', 'normal');

    // guardar cookie
    if ($action === 'cambiar-modo') {
        $nuevoModo = $this->request()->input('modo', 'normal');
        $this->response()->cookie('mi_modo', $nuevoModo);
    }

    // borrar cookie
    if ($action === 'borrar-modo') {
        $this->response()->withoutCookie('mi_modo');
    }

    return parent::execPreviousAction($action);
}
Cookies
Usamos cookies necesarias para el funcionamiento del sitio y cookies opcionales para recordar tus preferencias y mejorar tu experiencia. Puedes aceptarlas todas, rechazarlas o configurar tus preferencias

Soporte