TransWikia.com

redirigir a otra pagina en symfony

Stack Overflow en español Asked on December 18, 2021

estoy empezando con symfony (3.4) y lo que quiero hacer es que al pulsar el submit del formulario me redirija a otra pagina. lo hago con

return $this->redirectToRoute('genus/principal.html.twig');

pero obtengo el siguiente error: "Unable to generate a URL for the named route "genus/principal.html.twig" as such route does not exist."
mi codigo del controlador es este:

<?php
namespace AppBundleController;

use SymfonyBundleFrameworkBundleControllerController;

use SymfonyComponentHttpFoundationRequest;

use SymfonyComponentRoutingAnnotationRoute;

use SymfonyComponentHttpFoundationResponse;

use SensioBundleFrameworkExtraBundleConfigurationMethod;

use SymfonyComponentHttpFoundationJsonResponse;

use AppBundleFormGenusFormType;

class DefaultController extends Controller
{
/**

 * @Route("/", name="homepage")

 */

public function newAction(Request $request)

{

    $form = $this->createForm(GenusFormType::class);

    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {

        $genus = $form->getData();

        $em = $this->getDoctrine()->getManager();

        $em->persist($genus);

        $em->flush();

        return $this->redirectToRoute('genus/principal.html.twig');

    }

    return $this->render('genus/new.html.twig', [

        'genusForm' => $form->createView()

    ]);

}

}

tampoco tengo la seguridad de que se pueda redirigir a una pagina de tipo twig.

One Answer

El redirecToRoute sirve para redireccionar a una ruta que apunta a un action de un Controller. Es decir que el parámetro debe ser el nombre de esa ruta y no la ruta de la template. Ese nombre lo vas a encontrar dependiendo de que uses para definir la configuración de tus routings. En este caso estás usando Annotation.

/**

 * @Route("/", name="homepage")

 */

En ese caso si quisiera redirigir al newAction() usando redirecToRoute() debería hacer de la siguiente forma:

return $this->redirecToRoute('homepage');

Ahora bien, hay algo conceptual que tienes que tener en cuenta. Si lo que quieres es sólo redirigir a otro template o si quieres redirigir a otra ruta. Y si eso va depender de la lógica que le quieras dar tú. Como desconozco todo el dominio, te daré un ejemplo de cada caso.

Caso 1. Necesito redirigir a otra ruta

<?php
namespace AppBundleController;

use SymfonyBundleFrameworkBundleControllerController;

use SymfonyComponentHttpFoundationRequest;

use SymfonyComponentRoutingAnnotationRoute;

use SymfonyComponentHttpFoundationResponse;

use SensioBundleFrameworkExtraBundleConfigurationMethod;

use SymfonyComponentHttpFoundationJsonResponse;

use AppBundleFormGenusFormType;

class DefaultController extends Controller
{
    /**

    * @Route("/", name="homepage")

    */

    public function newAction(Request $request)

    {

        $form = $this->createForm(GenusFormType::class);

        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {

            $genus = $form->getData();

            $em = $this->getDoctrine()->getManager();

            $em->persist($genus);

            $em->flush();

            return $this->redirectToRoute('route_principal');

        }

        return $this->render('genus/new.html.twig', [

            'genusForm' => $form->createView()

        ]);

    }

    /**

    * @Route("/principal", name="route_principal")

    */

    public function principalAction(Request $request)

    {
        //aquí debe ir toda la lógica previa antes de renderizar a la template principal.html.twig
        return $this->render('genus/principal.html.twig');

    }

}

Caso 2. Necesito sólo renderizar a otra template.

<?php
namespace AppBundleController;

use SymfonyBundleFrameworkBundleControllerController;

use SymfonyComponentHttpFoundationRequest;

use SymfonyComponentRoutingAnnotationRoute;

use SymfonyComponentHttpFoundationResponse;

use SensioBundleFrameworkExtraBundleConfigurationMethod;

use SymfonyComponentHttpFoundationJsonResponse;

use AppBundleFormGenusFormType;

class DefaultController extends Controller
{
    /**

    * @Route("/", name="homepage")

    */

    public function newAction(Request $request)

    {

        $form = $this->createForm(GenusFormType::class);

        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {

            $genus = $form->getData();

            $em = $this->getDoctrine()->getManager();

            $em->persist($genus);

            $em->flush();

            return $this->render('genus/principal.html.twig');

        }

        return $this->render('genus/new.html.twig', [

            'genusForm' => $form->createView()

        ]);

    }
}

Si principal es el index por ejemplo y tienes que ir al listado de todos los genus, tendrías que pasar por un action que se encargue de obtener el listado de genus antes de ir a la template.

/**
     * Lists all genu entities.
     *
     * @Route("/genus", name="genu_index")
     * @Method("GET")
     */
    public function indexAction()
    {
        $em = $this->getDoctrine()->getManager();

        $genus = $em->getRepository('AppBundle:Genu')->findAll();

        return $this->render('genus/principal.html.twig', array(
            'genus' => $genus,
        ));
    }

Y desde el newAction() lo llamaría de la siguiente forma:

return $this->redirecToRoute('genu_index');

El resultado sería que después de crear uno nuevo, lo redirige nuevamente al listado principal.

Answered by xvrcjs on December 18, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP