Redirección después de enviar un formulario

Hola:

Seguimos a vueltas con Symfony. Tengo una duda relacionada con las direcciones. Quiero redireccionar después de enviar un formulario a la dirección referida. Como creo que me explico muy mal con:

$anterior = $this->container->get('request_stack')->getCurrentRequest()->headers->get('referer');
return $this->redirect($anterior);

Yo lo que quiero conseguir es esto:

Listado -> confirmación de borrado -> borrado -> listado

Lo que consigo es esto:

Listado -> confirmación de borrado

No se si me explicado correctamete, porque creo que me explico muy mal.

Saludos.

Respuestas

#1

Para hacer lo que planteas, necesitas dos plantillas (listado.html.twig y confirmacion.html.twig) y dos acciones en el controlador (listadoAction(), borradoAction()).

A grandes rasgos, este sería el código que debes utilizar:

public DefaultController extends Controller
{
    public function listadoAction(Request $request)
    {
        // ...
    }
 
    /**
     * @Route("/borrar/{id}/", name="borrar")
     */
    public function borradoAction(Request $request)
    {
        if (false === $request->query->getBoolean('confirmacion')) {
            return $this->render('confirmacion.html.twig');
        } else {
            $em = $this->getDoctrine()->...;
            $entidad = $em->...;
            $em->remove($entidad);
 
            return $this->redirect('listado.html.twig');
        }
    }
}

Y en la plantilla de confirmación es donde tienes que definir ese parámetro confirmacion que indica si el elemento tiene que borrarse o no:

{% extends 'layout.html.twig' %}
 
{# ... #}
 
<a href="{{ path('borrar', { id: entidad.id, confirmacion: 'true' }) }}">Borrar</a>

Te comento algunas cosas más:

  • En tu código original utilizas un parámetro referer, pero si siempre rediriges al listado, no hace falta utilizar un parámetro para saber a dónde quieres redirigir.
  • El código original utiliza la llamada al contenedor para obtener el servicio request_stack. A menos que obliguen a hacerlo así, no te recomiendo esa forma de trabajar. Mira el código que te he puesto de ejemplo para ver que es muy fácil acceder a la petición actual. En realidad Symfony es muy fácil, pero a veces nos complicamos nosotros mismos.
  • Me parece que mostrar una pantalla intermedia para confirmar el borrado es innecesario. Puede llegar a cansar al usuario final y complica nuestro trabajo. A menos que te obliguen a hacerlo así, yo utilizaría una ventana modal para confirmar el borrado. Aquí puedes ver un ejemplo de cómo hacerlo.
  • Por último, para borrar un elemento no deberías utilizar el método GET y pasar parámetros en el query string, tal y como te he mostrado en el ejemplo anterior. Para hacerlo bien y evitar problemas, tienes que utilizar el método DELETE de HTTP, lo que te obliga a crear un formulario sólo para el botón de borrar. Como suena raro, aquí puedes ver un ejemplo de este formulario de borrado.