Symfony2 incluye un objeto de sesión que permite almacenar información persistente sobre el usuario, es decir, información que se guarda de una petición a otra. Por defecto Symfony2 almacena la información en una cookie usando las sesiones nativas de PHP.
Desde cualquier controlador resulta sencillo almacenar y recuperar información de la sesión:
use Symfony\Component\HttpFoundation\Request;
public function indexAction(Request $request)
{
$session = $request->getSession();
// guarda un atributo para reutilizarlo durante una
// petición posterior del usuario
$session->set('foo', 'bar');
// obtener el valor de un atributo de la sesión
$foo = $session->get('foo');
// utilizar un valor por defecto si el atributo no existe
$filters = $session->get('filters', array());
}
Esta información se mantendrá asociada al usuario mientras no caduque su sesión.
5.7.1. Mensajes flash
Este tipo de mensajes se utilizan para almacenar una pequeña cantidad de información que solo está disponible durante la siguiente petición (después se borran automáticamente). Estos mensajes son muy útiles cuando procesas por ejemplo un formulario (por el momento no te fijes en los detalles del formulario, solo en cómo crear el mensaje flash):
use Symfony\Component\HttpFoundation\Request;
public function updateAction(Request $request)
{
$form = $this->createForm(...);
$form->handleRequest($request);
if ($form->isValid()) {
// código que procesa el formulario ...
$this->get('session')->getFlashBag()->add(
'notice',
'Se han guardado los cambios.'
);
return $this->redirect($this->generateUrl(...));
}
return $this->render(...);
}
Después de procesar la petición, el controlador crea un mensaje flash llamado notice
y luego redirige al usuario a otra página. El nombre del propio mensaje (notice
en este caso) no tiene importancia, ya que solo es un identificador único que utilizas en tu código.
En la plantilla asociada a la siguiente petición, puedes mostrar (si quieres) el contenido de ese mensaje utilizando el siguiente código:
{% for flashMessage in app.session.flashbag.get('notice') %}
<div class="flash-notice">
{{ flashMessage }}
</div>
{% endfor %}
<?php foreach ($view['session']->getFlash('notice') as $message): ?>
<div class="flash-notice">
<?php echo "<div class='flash-error'>$message</div>" ?>
</div>
<?php endforeach; ?>
Recuerda que los mensajes flash solo están disponibles durante la siguiente petición después de haber sido creados. Tanto si muestras su contenido como si lo ignoras, el mensaje flash se borra automáticamente después de esa petición. El objetivo de estos mensajes es mostrar algún aviso después de una redirección, tal y como se ha mostrado en el ejemplo anterior.