Search code examples
symfonysymfony-cmfsymfony-routing

Symfony redirect to dynamic route name


I'm using the Symfony CMF Routing Bundle to create dynamic routes (I'm using one example here):

$route = new Route('/dynamic-url');
$route->setMethods("GET");
$route->setDefault('_controller', 'AppBundle:MyRoute:getResponse');

$routeCollection->add('my-dynamic-route', $route);

The response is loaded from the getResponseAction() function inside the MyRouteController:

/**
 * No annotations here, because I want the url to be dynamic from the database
 */
public function getResponseAction(Request $request) {

    return $this->render('dynamic-page-template.html.twig');

}

When I go to '/dynamic-url', it works.

When in another controller, I want to redirect to this dynamic route, like this:

return $this->redirectToRoute('my-dynamic-route');

But I get this error: "None of the chained routers were able to generate route: Route 'my-dynamic-route' not found"

Also interesting: when I go to '/dynamic-url', the dev bar actually says that the Route name is 'my-dynamic-route'.

Edit

When I load all the routes, I don't see my dynamic route names:

$this->get('router')->getRouteCollection();

I think they should be in this list.


Solution

  • Since it's a dynamic route, which wasn't saved anywhere (like routing.yml ) it will be only availabe for Request where it has been defined. So at the end of Request your app will immediately "forget" about new Route generated at runtime.

    When I load all the routes, I don't see my dynamic route names: $this->get('router')->getRouteCollection(); I think they should be in this list.

    Actualy No. It depends on where you call $this->get('router')->getRouteCollection(); Just try to call

    dump($this->get('router')->getRouteCollection();)
    

    right before the return statement in your Action where you're adding the my-dynamic-route route. I'm sure you'll see your my-dynamic-route in the list of routes, but if you call it anywhere else - you won't see it.

    It's less about symfony rather about stateless nature of web (see Why say that HTTP is a stateless protocol?)