Cookies con Spoon avanzado

  • Por
  • PHP
Unos pequeños detalles un poco más avanzados sobre el manejo de Cookies en PHP por medio de las librerías Spoon.
En el artículo anterior del manual de las librerías Spoon explicamos las generalidades sobre el uso de cookies por medio de la librería Spoon. En el presente texto pretendemos ofrecer las explicaciones restantes sobre el trabajo con Cookies, que nos permiten configurar el tiempo de permanencia de la cookie en el navegador del usuario, el ámbito donde tendrá validez, etc. Acabaremos mostrando cómo con estas mismas funciones de Spoon podrás almacenar cualquier cosa en una cookie, incluso un objeto.

Vamos a ver para comenzar los distintos parámetros opcionales que podemos enviar al método set() de la clase SpoonCookie, que utilizamos para almacenar la cookie.

Configurar una cookie para permanecer durante un tiempo dado:
La cookie por defecto tiene 24 horas de caducidad, pero nosotros podemos indicar cualquier otro tiempo que podamos necesitar. Para ello enviamos al método set(), para crear la cookie, un tercer parámetro, con un valor entero que son los segundos que debe permanecer la cookie guardada en el navegador del usuario.

//Indicamos el tiempo que debe permanecer esta cookie, en segundos
SpoonCookie::set('cookie31dias', 'Valor de la cookie que dura 31 días', (31*24*60*60));

Carpeta donde la cookie tendrá validez:
Igual que con la función setcookie() de PHP, podemos indicar un cuarto parámetro opcional para decir el directorio donde esa cookie debe existir. Por defecto la cookie se crea con validez para cualquier directorio.

//indicamos el directorio en el que estará disponible
SpoonCookie::set('cookiedirectorio', 'Valor de la cookie que solo se muesrta en un directorio', (31*24*60*60), "/carpeta");

Subdominio donde existirá la cookie:
En el quinto parámetro podemos indicar los subdominios donde la cookie tendrá validez. Por defecto sólo será valida en el subdominio donde se cree, pero podríamos indicar cualquier otro subdominio o una expresión para indicar todos los subdominios.

//Que estará disponible para todos los subdominios
SpoonCookie::set('cookiesubdominios', 'valor para todos los subdominios', 86400, '/', '.midominio.com');

Asegurar que la cookie se transfiere por HTTPS:
El sexto y último parámetro es un boleano para asegurarse que la cookie viaje de manera segura por medio del protocolo HTTPS.

//que nos aseguramos viajará a través de https
SpoonCookie::set('cookiehttps', 'valor para que viajará seguro', 86400, '/', '.midominio.com', true);

Almacenar cualquier tipo de datos en la cookie con PHP

Una de las ventajas de la librería para el trabajo con cookies de Spoon es que podemos almacenar cualquier tipo de datos en una cookie y no solo cadenas de texto. Por ejemplo, podríamos colocar algo como una instancia de una clase, es decir, un objeto. Luego podríamos recuperar ese objeto en esa u otra página, días o meses después, y permanecería tal como estaba en el momento que se guardó.

Esto es gracias a que toda la información que se almacena en las cookies está serializada, es decir, se ha convertido a una cadena de caracteres. Esa cadena de caracteres contiene codificada toda la información de nuestros datos, por complejos que sean y más adelante podemos invertir el proceso de serialización para recuperar el dato original. Todo esto lo hace Spoon de manera transparente para nosotros, es decir, sin tener que hacer nada adicional.

Veamos una página que crea una cookie a partir de un objeto:

<?php
//directorio de include para spoon
define('PATH_LIBRARY', 'C:/xampp/htdocs/');
set_include_path(get_include_path() . PATH_SEPARATOR . PATH_LIBRARY);

//incluyo spoon y la librería de cookies
require_once 'spoon/spoon.php';
require_once 'spoon/cookie/cookie.php';

//defino una clase de ejemplo con PHP 5
class potencia{
   public $x;
   
   function __construct($x){
      $this->x = $x;
   }
   
   function potenciar(){
      $this->x *= $this->x;
   }
}

//Creo un objeto
$objeto = new potencia(4);

//guardo una cookie
SpoonCookie::set('cookieobj', $objeto);
?>

En el código se puede ver la declaración de una clase y luego la instanciación de un objeto. Por último ese objeto se guarda en una cookie por medio del método set() de la clase SpoonCookie.

Cabe fijarse que al crear el objeto se envía el valor 4 al construtor, con lo cual se carga en el atributo "x" del objeto el valor 4. Luego accederemos a ese valor para ver si continua inalterado.

Ahora podemos ver el código de una página que recibe esa cookie y luego trabaja con el valor como si fuera el objeto normal que se guardó.

//directorio de include para spoon
define('PATH_LIBRARY', 'C:/xampp/htdocs/');
set_include_path(get_include_path() . PATH_SEPARATOR . PATH_LIBRARY);

//incluyo spoon y la librería de cookies
require_once 'spoon/spoon.php';
require_once 'spoon/cookie/cookie.php';


//defino una clase de ejemplo con PHP 5
class potencia{
   public $x;
   
   function __construct($x){
      $this->x = $x;
   }
   
   function potenciar(){
      $this->x *= $this->x;
   }
}

//Miro a ver si la cookie existe
if(SpoonCookie::exists('cookieobj')){
   //recibo el objeto de la cookie
   $obj = SpoonCookie::get('cookieobj');
   
   //muestro el valor público $x
   echo $obj->x;
   //llamo al método sumar
   $obj->potenciar();
   //muestro de nuevo el valor público $x que ha cambiado
   echo "<br>" . $obj->x;
}else{
   echo "no encontré esa micookie";
}

Como se puede ver, para que PHP entienda el objeto serializado que vamos a recuperar de la cookie, debo tener la declaración de la clase PHP que define a ese objeto.

En el código se puede ver cómo se recibe la cookie almacenada en la página anterior y se guarda en la variable $obj. Luego se opera con esa variable como si fuera el objeto original. Se muestra el valor de $obj->x (habíamos almacenado en la página anterior el valor 4) y luego se llama al método potenciar() y se muestra de nuevo el valor de $obj->x que ha cambiado como consecuencia de la ejecución del método potenciar().

En definitiva, hemos visto que utilizando estas funciones de las librerías Spoon podemos guardar en las cookies otros tipos de datos, aparte de cadenas de caracteres y que todo el proceso se hace de manera transparente para nosotros.