Symfony 重定向到动态路由名称

Symfony redirect to dynamic route name

我正在使用 Symfony CMF Routing Bundle 来创建动态路由(我在这里使用一个示例):

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

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

响应是从 MyRouteController 中的 getResponseAction() 函数加载的:

/**
 * 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');

}

当我转到“/dynamic-url”时,它起作用了。

在另一个控制器中,我想重定向到这个动态路由,像这样:

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

但是我得到这个错误:"None of the chained routers were able to generate route: Route 'my-dynamic-route' not found"

同样有趣:当我转到“/dynamic-url”时,开发栏实际上说路由名称是 'my-dynamic-route'.

编辑

当我加载所有路由时,我没有看到我的动态路由名称:

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

我认为他们应该在这个列表中。

因为它是一个动态路由,没有保存在任何地方(比如 routing.yml ),所以它只对已定义的 Request 可用。因此,在请求结束时,您的应用程序将 立即 "forget" 关于在运行时生成的新路由。

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.

实际上没有。这取决于你在哪里打电话$this->get('router')->getRouteCollection(); 试着打电话

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

就在您要添加 my-dynamic-route 路由的 Action 中的 return 语句之前。我相信您会在路线列表中看到您的 my-dynamic-route,但如果您在其他任何地方调用它 - 您将看不到它。

它不是关于 symfony,而是关于网络的无状态性质(参见 )

我开始考虑这个问题并将您的问题指向 symfony-cmf 上的 routing issue。你用#symfony-cmf 标记,我认为这对我们来说是一个重要的功能。

我还认为,当您使用 /my-route 坚持您的路由时,您还应该向路由器询问该名称(或者如果 CMF 的内容对象带有该路由。)

如果您使用 CmfRoutingBundle 动态路由器,您应该坚持您的路由原则。这里动态的想法是它们可以在运行时创建,例如在管理界面或其他地方通过代码。 DynamicRouter 从数据库加载路由。

如果您使用 PHPCR-ODM,路由名称就是存储库 ID,通常类似于 /cms/routes/my-routeyou can generate it with that name。如果您有权访问从数据库加载的路由对象,您也可以从中生成,而不是路径。如果您必须在应用程序中对路径进行硬编码,这表明正常配置的路由可能会更好。

如果您只是动态地将路由添加到路由集合,则必须确保在每个请求中都发生这种情况,只有在您添加它时它才可用。使用 CMF ChainRouter,您可以注册自己的路由器来执行此操作,但我不知道有什么好的用例。要么你知道路由,然后你可以在 routing.xml|yml|php 配置文件中配置它。或者路由是动态加载的,此时您应该使用 DynamicRouter,可能带有 custom route loader.