Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Problema con ruta variable en Symfony

26 de enero de 2015

Hola, tengo un problema con las rutas en un controlador. El problema es entre una ruta que tiene una parte estática y otra con una parte variable

El problema radica en:

/**
 * @Route(
 *      "/wiki/",
 *      name="wiki_front"
 * )
 * @Method("GET")
 */
public function wikiFrontAction() {
 
  $repository = $this->getDoctrine()
                     ->getRepository('AppBundle:Categoria');
  $categorias = $repository->findAll();
 
  return $this->render('AppBundle:Front:wiki.html.twig', array(
    'categorias' => $categorias
  ))->setSharedMaxAge(600);
}
 
/**
 * @Route(
 *      "/{fija}/",
 *      name="fija",
 *      requirements={"fija": "wtf|contacto|gens"}
 * )
 * @Method("GET")
 */
public function fijaAction($fija) {
  $fija = strtolower($fija);
  return $this->render('AppBundle:Front:'.$fija.'.html.twig')->setSharedMaxAge(600);
}

Puse la ruta /wiki antes que /fija para que así detecte el wiki antes de la variable fija, y para limitar esta le puse el requeriments. Pero me sigue saliendo el error de:

An exception has been thrown during the rendering of a template
("Parameter "fija" for route "fija" must match "wtf|contacto|gens"
("wiki" given) to generate a corresponding URL.") in
AppBundle:Front:base.html.twig at line 97.

Seguí las instrucciones de el libro y puse la ruta estática antes ¿no debería detectarla antes que la fija?


Respuestas

#1

Como tú mismo dices, a la hora de definir rutas lo importante es su orden. El prier orden que se mira es cómo se importan los bundles, archivos, etc. en app/config/routing.yml. Después, si has importado todo un bundle que usa anotaciones, se importan sus controladore spor orden alfabético. Por último, dentro de un controlador se importan las rutas en el mismo orden en el que han sido definidas dentro del controlador.

Siempre que se produzca un error de enrutamiento difícil de comprender, lo primero que debes hacer es ejecutar el siguiente comando:

$ php app/console router:match /wiki/

El comando te dirá quién está respondiendo a la URL que le indicas. Si está respondiendo el controlador que esperas, entonces hay un error en la plantilla al generar el enlace. Si no está respondiendo el controlador que esperas, hay un error en el orden en el que se importan las rutas.

@javiereguiluz

26 enero 2015, 8:29
#2

La verdad es que ya revisé todo y no se por qué no funciona. Lo he solucionado haciendo un:

if (fija == "wiki") {
    return $this->redirectToRoute('wiki_front');
}

En el controlador que tiene la parte variable, pero voy a seguir revisando. Gracias por el tiempo que te tomas aclarando mis dudas.

@SakyaStelios

26 enero 2015, 23:53