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.