Ver índice de contenidos del libro

5.7. Gestionando la sesión

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:

$session = $this->getRequest()->getSession();
 
// guarda un atributo para reutilizarlo durante una posterior petición del usuario
$session->set('foo', 'bar');
 
// en otro controlador por otra petición
$foo = $session->get('foo');
 
// establecer el idioma del usuario
$session->setLocale('fr');

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):

public function updateAction()
{
    $form = $this->createForm(...);
 
    $form->bindRequest($this->getRequest());
    if ($form->isValid()) {
 
        // código que procesa el formulario ...
 
        $this->get('session')->setFlash('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:

{% if app.session.hasFlash('notice') %}
    <div class="flash-notice">
        {{ app.session.flash('notice') }}
        </div>
{% endif %}
<?php if ($view['session']->hasFlash('notice')): ?>
    <div class="flash-notice">
        <?php echo $view['session']->getFlash('notice') ?>
        </div>
<?php endif; ?>

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.