Cookies en Laravel

  • Por
  • PHP
Tutorial y referencia para el trabajo con cookies en Laravel 5. Crear cookies, recuperar el valor de cookies guardadas, etc.

Las cookies son de sobra conocidas por todos. Sirven para almacenar pequeñas cantidades de información textual en el navegador del usuario, que podrán persistir entre diferentes visitas a un mismo sitio web. Por supuesto, en Laravel se hacen un buen cargo de ellas, facilitando procedimientos como la creación o lectura de cookies de una manera sencilla.

Este artículo te servirá como referencia y guía para el trabajo con Cookies, aprendiendo a crearlas desde el sistema de "Response" y a acceder a ellas mediante el sistema de "Request".

Cómo funcionan las Cookies

Antes de explicar los mecanismos que nos ofrece Laravel creo que unas pequeñas notas sobre cómo funcionan las cookies aclararán muchas dudas. Como no es el objetivo de este artículo hablar de cookies en general, lo voy a esquematizar en cuatro puntos:

  • La creación de cookies desde el servidor, en lenguajes como PHP, se debe producir en la respuesta de una solicitud HTTP (Response). Osea, solo cuando devuelvo los datos de una solicitud al servidor soy capaz de escribir una cookie en el navegador.

  • La lectura de cookies se realiza a través de la petición. Si el navegador del usuario tiene alguna cookie almacenada en el sistema, llega al servidor en la solicitud emitida por el cliente web (Request).

  • Las cookies viajan en las cabeceras del protocolo HTTP, de manera transparente para el usuario. La información para la creación o actualización de cookies se escribe dentro de las cabeceras del HTTP de respuesta. La información para la lectura de las cookies viaja al servidor en las cabeceras HTTP de la solicitud.

  • Por todo ello, cuando proceso una página en el servidor que escribe una cookie, esa cookie solo estará presente para lectura en la siguiente solicitud que se realice al servidor.

Cookies en Laravel

Como comprenderás según lo anterior, las cookies forman parte de dos sistemas de Laravel, el de Request para acceder a las cookies creadas, así como el de Response para almacenar nuevas o actualizar antiguas cookies.

Además es interesante saber que todas las cookies gestionadas por Laravel están encriptadas y firmadas con un código de autenticación, de eso modo podemos asegurar que no han sido modificadas a mano por el usuario.

Crear cookies en el navegador con Laravel

Las cookies que creamos desde Laravel son instancias de una clase de Symfony: Symfony\Component\HttpFoundation\Cookie. Para crearlas Laravel ofrece diversos mecanismos que veremos. El más sencillo y directo es un helper llamado cookie() que realiza la tarea por nosotros.

Los parámetros básicos del helper cookie(), que querrás utilizar al crear la mayoría de cookies, serán el nombre de la cookie, su valor y el tiempo de persistencia (en este caso expresado en minutos).

$nueva_cookie = cookie('nombre', 'valor', $minutos);

Si queremos que la cookie se recuerde por el mayor tiempo posible (lo máximo son 5 años) puedes usar esta otra alternativa de código.

$nueva_cookie = cookie()->forever('micookie', 'mivalor');

Con eso obtengo el objeto de la clase Cookie, pero todavía me falta enviarlo al navegador, algo que veremos enseguida.

Además también puedes crear cookies con otra serie de parámetros, opcionales, que listamos a continuación en el orden en el que tienen que ser entregados. Como verás, son prácticamente los mismos parámetros que para hacer cookies en PHP "nativo".

Nombre de la cookie (string)
Valor (string)
Minutos de persistencia (entero)
Camino/ruta donde va a estar disponible (string)
Dominio o subdominio de existencia (string)
Si es segura, https (boleano)
Si es solo insegura, no https (boleano)

Por defecto están disponibles para el subdominio donde se creó, y son sólo para http normal. Enviar una Cookie al navegador en el sistema de "Response"

Para enviar una Cookie al navegador se debe adjuntar a la respuesta. Esto lo tienes que hacer desde el sistema de Response, para lo que necesitas un objeto de la clase Response.

Nota: Los objetos de la clase Response los obtienes de varias maneras y es algo que ya explicamos en el artículo sobre Responses en Laravel 5.

La clase Response tiene un método llamado withCookie() que adjunta un objeto Cookie en la respuesta de la solicitud HTTP. Así Laravel, al construir la respuesta que enviará al navegador será capaz de enviarle también la cookie adjuntada.

$response = response("Voy a enviarte una cookie");
$response->withCookie($nueva_cookie);

Aquí estamos usando el helper response() para obtener el objeto de la clase Response de Laravel, luego estamos enviando en la respuesta la cookie $nueva_cookie. Obviamente, $nueva_cookie es una referencia a un objeto Cookie como los que acabamos de enseñar a crear.

Ahora puedes ver un sencillo ejemplo de creación de una cookie, procedimiento que hemos colocado en una closure del sistema routing, para facilitar las cosas.

Route::get('pruebacookie', function(){
	$nueva_cookie = cookie('probando', 'valorprobando', 60);
	$response = response("Voy a enviarte una cookie");
	$response->withCookie($nueva_cookie);
	return $response;
});

Lectura de una Cookie mediante el sistema de request

Ahora veamos cómo leer una cookie ya creada. Es algo que hacemos a través del sistema de Request. Podríamos leerla de varias maneras:

  1. A partir de la "facade" (fachada) de Request.

    Request::cookie('nombre_de_la_cookie');


    Nota: Recuerda hacer el "use Request;" para tener acceso a esta fachada. Otra alternativa sería anteponer una contrabarra en Request para que Laravel sepa que te estás refiriendo al namespace global.


    \Request::cookie('nombre_de_la_cookie');


  2. Como alternativa, si hemos inyectado el correspondiente objeto de la clase Request en el método del controlador, tenemos acceso al método cookie() a partir de ese objeto:

    public function personalizar(Request $request){
    	$cookie_leida = $request->cookie('nombre');
    	// resto del código del controlador
    }

Si la cookie que intentamos recibir no estaba en el navegador del usuario, este método devolverá null como valor de la cookie. Para evitarnos tener que comprobar si el valor es null y en ese caso establecer un valor predeterminado, podemos llamar al método cookie() indicando como segundo parámetro el valor a cargar por "default" (en caso que no exista la cookie).

Request::cookie('cookie_lectura', "valor_x_default");

Dejar cookies en la cola de escritura

Ahora vamos a hablar de otro mecanismo interesante de trabajo con Cookies que nos relatan en la documentación de Laravel 5.0.

Nota: Es importante señalar que este mecanismo de encolado de la cookie ha sido borrado de la documentación de Laravel 5.1. Quizás lo han recolocado en algún otro lugar o quizás piensan eliminarlo del framework. Sin embargo, el código está probado y sigue funcionando perfectamente en la versión 5.1.

Puede darse el caso que quieras generar una cookie y todavía no se haya construido el objeto response y por cualquier motivo no lo desee hacer en este momento. En ese caso puedo dejar las cookies encoladas para su escritura en la siguiente respuesta (Response) que se genere.

Eso se consigue fácilmente con la fachada Cookie y el método estático queue().

Cookie::queue($una_cookie_a_encolar);

Nota: Para que Cookie esté disponible recuerda hacer el "use Cookie;". O bien la alternativa de comenzar con una contrabarra, para indicar que esta clase se encuentra en el namespace global.

\Cookie::queue(\Cookie::make('cuco', 'cucurucu', 60 * 24 * 365));

Redirigir con envío de cookie

En ocasiones podemos necesitar crear una cookie en un response que no muestre contenido, sino que redirija al usuario a otra página. Eso es perfectamente posible en Laravel, solo que no usarás un objeto response tal cual como hemos aprendido anteriormente, sino que lo harás con una instancia de un objeto "redirector".

El siguiente código crea una ruta que redirige a otra. En la redirección se añade una cookie usando el mismo método withCookie() que hemos invocado sobre un objeto Response, solo que ahora lo invocamos sobre el objeto Redirector que nos devuelve el helper redirect().

Route::get('redirigecookie', function(){
	return redirect('/otra/ruta/a/redirigir')->withCookie(cookie('redir', '1234', 20));
});

En este caso, como la cookie se genera en la Response que realiza la redirección, cuando el usuario accede a /otra/ruta/a/redirigir la cookie ya está disponible en el sistema.

Nota: No hemos hablado todavía en profundidad de redirecciones, pero lo haremos en breve. De todos modos, la cosa es bastante sencilla, si te apoyas en el helper redirect(), como habrás podido apreciar.

En el siguiente artículo vamos a seguir trabajando con Cookies pero de manera más práctica. Realizaremos un ejemplo completo en Laravel en el que haremos diversas cosas que nos ayudarán a repasar todo lo aprendido.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Jose

23/5/2016
Localizacion de las cookies
En que carpeta de laravel se colocan las cookies, tengo lo siguiente tengo un combobox o dropdown que se llena desde una base de datos, y quiero crear una cookie con los datos que me trae desde alli, donde iría el codigo de la cookie? directo en la view, en la rutas o en los controladores? muchas gracias de antemano por su pronta respuesta.