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.
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP