Cookies en Symfony

Introducción al manejo de cookies en el framework Symfony mediante el método setCookie y otros métodos disponibles para la administración de cookies

Contenido modificable

Si ves errores o quieres modificar/añadir contenidos, puedes crear un pull request. Gracias

Para establecer cookies en Symfony simplemente se ha de utilizar el atributo público headers:

use Symfony\Component\HttpFoundation\Cookie;

$response->headers->setCookie(new Cookie('foo', 'bar'));

El método setCookie() toma una instancia de Cookie como argumento:

public __construct (string $name, string $value = null, int|string|DateTime $expire, string $path = '/', string $domain = null, bool $secure = false, bool $httpOnly = true)

Sus parámetros son:

string $name Nombre de la cookie
string $value Valor de la cookie
int string DateTime $expire La hora a la que expira la cookie
string $path El directorio en el servidor en el cual estará disponible la cookie
string $domain El dominio en el que la cookie estará disponible
bool $secure Si la cookie se ha de transmitir vía HTTPS
bool $httpOnly Si la cookie será accesible sólo a través del protocolo HTTP

Ejemplo sencillo de establecer dos cookies y luego mostrarlas con Twig:

// src/AppBundle/Controller/DefaultController.php
class DefaultController extends Controller
{
    /**
     * @Route("/set", name="setcookies")
     */
    public function setCookiesAction ()
    {
        $response = $this->render('setcookies.html.twig');

        $response->headers->setCookie(new Cookie('Peter', 'Griffin', time() + 3600));
        $response->headers->setCookie(new Cookie('Homer', 'Simpson', time() + 3600));

        return $response;
    }

El controlador devuelve una respuesta en una template twig, que en este caso es setcookies.html.twig y puede estar vacía, o mostrar un mensaje como "Las cookies se han establecido".

/**
 * @Route("/get", name="getcookies")
 */
public function getCookiesAction (Request $request)
{
    $cookies = $request->cookies;
    $response = $this->render('getcookies.html.twig', array(
        'cookies' => $cookies
    ));

    return $response;
}

Ahora hemos empleado el type hinting con la clase Request para obtener las cookies de los headers. Después simplemente renderizamos la template getcookies.html.twig, y le pasamos el array de cookies $cookies. En la template ahora podemos poner un listado de las cookies:

<ul>
    {% for key, value in cookies %}
        <li>{{ key }} - {{ value }}</li>
    {% endfor %}
</ul>

Otras funciones disponibles para cookies:

  • _clearCookie(). Limpia una cookie del navegador ($response->headers->clearCookie('Homer')_).
  • getCookies(). Devuelve un array con todas las cookies.
  • removeCookie(). Elimina una cookie del array, pero no la quita del navegador ($response->headers->removeCookie('Peter')).

Lo que ocurre en clearCookie() es que Symfony envía un header set-Cookie con el valor "deleted" y con fecha de expiración en 1970 (ya caducada):

Homer=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; httponly

En cambio removeCookie() no envía ningún header set-Cookie al navegador. En nuestro ejemplo esta función no evitaría que se siguiera mostrando la cookie Homer, ya que sigue estando en el navegador.