Cómo usar mensajes flash en Symfony 3 (dentro del controlador y la vista Twig)

Un sistema que no nota al usuario sobre las cosas que hace, simplemente apesta. Esa es la razón principal por la que siempre debe implementar algún tipo de sistema de notificación en su proyecto, sea cual sea la forma, por ejemplo, con JavaScript o simplemente agregando un marcado adicional a su documento con su idioma de servidor favorito. En Symfony, puede utilizar el útil sistema flash que le permite configurar mensajes personalizados con una categoría personalizada en la sesión del visitante.

En su controlador Symfony, son bastante útiles para almacenar mensajes especiales que deberían mostrarse una vez que el usuario visita una vista. Se llama mensaje flash porque está almacenado en la sesión (no le importa si ha iniciado sesión o no) y una vez que el usuario visita (o es redirigido a) otra ruta de su proyecto, puede ser manejado por usted (que se muestra en la vista) y luego desaparecerá. En pocas palabras, desaparecen de la sesión automáticamente tan pronto como los recupera. Esta función hace que los mensajes "flash" sean especialmente buenos para almacenar notificaciones de usuario. En este artículo, le mostraremos cómo usar y mostrar mensajes flash fácilmente en su aplicación Symfony 3.

1. Cómo crear mensajes flash

Para agregar un mensaje flash a la sesión desde sus controladores, deberá usar el $this->addFlash método. Este método ya está disponible en tu clase si amplía la clase Controller de Symfony. El método flash funciona de la siguiente manera:

Nota

Recuerda que no puedes usar el addFlashmétodo si las sesiones están deshabilitadas.

/**
 * Agrega un mensaje flash a la sesión actual para el tipo.
 *
 * @param string $type    The type
 * @param string $message El mensaje
 *
 * @throws \LogicException
 */
protected function addFlash($type, $message)

En versiones anteriores de Symfony <2.7, era necesario acceder al contenedor, luego recuperar la sesión, de la sesión recuperar el flashBag y finalmente usar el método add (que espera los mismos argumentos que addFlash porque $this->addFlash es simplemente un atajo del proceso que necesitas hacer en Symfony <2.7):

// Recuperar flashbag del controlador
$flashbag = $this->get('session')->getFlashBag();

// Agregar mensaje flash
$flashbag->add($type, $message);

Aunque puede usar el método addFlash desde el controlador, también puede usar el método Symfony 2.7 en proyectos recientes. 

El siguiente ejemplo muestra cómo agregar varios mensajes flash dentro de su controlador con diferentes tipos:

<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction()
    {
        // 1. Usando el método de acceso directo del controlador

        // Agregar un mensaje de tipo de éxito
        $this->addFlash("success", "This is a success message");

        // Agregar un mensaje de tipo de advertencia
        $this->addFlash("warning", "This is a warning message");

        // Agregar un mensaje de tipo de error
        $this->addFlash("error", "This is an error message");

        // Al agregar un mensaje de tipo personalizado, ¡recuerde que el tipo depende totalmente de usted!
        $this->addFlash("bat-alarm", "Gotham needs Batman");

        // 2. Recuperar manualmente el flashbag

        // Recuperar flashbag del controlador
        $flashbag = $this->get('session')->getFlashBag();

        // Establecer un mensaje flash
        $flashbag->add("other", "This is another flash message with other type");

        // Renderizar una vista de ramitas
        return $this->render("default/index.html.twig");
    }
}

Tenga en cuenta que el argumento de tipo dado es una clave para una matriz privada, lo que significa que puede agregar varios mensajes flash a una sola categoría, por ejemplo, varios mensajes de éxito y error:

<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction()
    {
        // 1. Usando el método de acceso directo del controlador

        // Agregar 2 mensajes de tipo de éxito
        $this->addFlash("success", "This is the first success message");
        $this->addFlash("success", "This is the second success message");

        // Agregar 2 mensajes de tipo de error
        $this->addFlash("error", "This is the first error message");
        $this->addFlash("error", "This is the second error message");

        // Renderizar una vista de twig
        return $this->render("default/index.html.twig");
    }
}

Si desea aprender de inmediato cómo mostrarlos, vaya al paso 3.

2. Cómo eliminar mensajes flash

Si ya agregó un mensaje flash a la sesión, pero por alguna razón no desea mostrarlo más, debe eliminarlo. Como se mencionó anteriormente, los mensajes flash desaparecen una vez que se recuperan, por lo que, para eliminarlos, solo necesita acceder al método get con el tipo de mensaje flash como primer argumento sin un puntero (no almacene su valor en una variable) :

<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction()
    {
        // Recuperar flashbag del controlador
        $flashbag = $this->get('session')->getFlashBag();

        // Establecer un mensaje flash
        $flashbag->add("bat-alarm", "Gotham needs Batman");

        // Recupera el valor (que no se está asignando a una variable)
        // y, por lo tanto, se "elimina" de la carpeta flash.
        $flashbag->get("bat-alarm");

        // Renderizar una vista de twig
        return $this->render("default/index.html.twig");
    }
}

Ahora, en la vista, el bat-alarmtipo ya no se representará en la vista, ya que se recuperó antes (eliminado).

3. Mostrar mensajes flash

Según la forma en que agregó los mensajes, existen 2 formas de mostrar los mensajes flash:

Nuevo en Symfony versión 3.3

La app.flashes()función Twig se introdujo en Symfony 3.3.

Flash por tipo

En Symfony> 3.3 puede proporcionar el tipo de flashes que desea mostrar en la vista como primer argumento en la función flashes de la aplicación:

{% for message in app.flashes('success') %}
    <div class="flash-notice">
        {{ message }}
    </div>
{% endfor %}

En Symfony 3.X <3.3, puede mostrar todos los mensajes de un tipo predefinido en su vista proporcionándolo como primer argumento para la función get del flashBagobjeto en la sesión:

{% for flash_message in app.session.flashBag.get('success') %}
    <div class="alert alert-success">
        {{ flash_message }}
    </div>
{% endfor %}

Solo necesitaría cambiar el tipo y eso es todo.

Mostrar todos los mensajes flash

¿Demasiado perezoso para filtrar el tipo de mensajes en la vista? Luego, automatice la tarea configurando la clase de a divcomo la categoría del mensaje flash que se mostrará en la vista y luego recorra todos los mensajes del flashbag en Twig. Este ejemplo funciona muy bien con Bootstrap, ya que tiene la alert alert-<type>clase que muestra un div de alerta con colores personalizados en la página:

{% for label, messages in app.flashes %}
    {% for message in messages %}
        <div class="alert alert-{{ label }}">
            {{ message }}
        </div>
    {% endfor %}
{% endfor %}

Si está utilizando Symfony 3.X <3.3, también puede iterar a través del objeto app.session.flashbag.all:

{% for label, flashes in app.session.flashbag.all %}
    {% for flash in flashes %}
        <div class="alert alert-{{ label }}">
            {{ flash }}
        </div>
    {% endfor %}
{% endfor %}

Que te diviertas ❤️!

Esto podria interesarte

Conviertete en un programador más sociable