我使用Symfony CMF路由捆绑包创建动态路由(我在这里使用一个示例):
$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');
但是我得到了这个错误:"没有一个链式路由器能够生成路由:路由' my-dynamic-route'找不到"
同样有趣的是:当我转到' / dynamic-url'时,开发栏实际上说道路名称是“我的动态路线”。
修改
当我加载所有路线时,我看不到我的动态路线名称:
$this->get('router')->getRouteCollection();
我认为他们应该在这个列表中。
答案 0 :(得分:1)
由于它是一个动态路由,并未在任何地方保存(例如routing.yml),因此只有在已定义的请求时才可用。因此,在请求结束时,您的应用将立即"忘记" 关于在运行时生成的新路由。
当我加载所有路线时,我看不到我的动态路线名称:
$this->get('router')->getRouteCollection();
我认为他们应该在这个列表中。
Actualy否。这取决于你拨打的地方$this->get('router')->getRouteCollection();
试着打电话
dump($this->get('router')->getRouteCollection();)
在行动中的退货声明之前,您正在添加my-dynamic-route
路线。我确定你会在路线列表中看到你的my-dynamic-route
,但如果你在其他任何地方打电话 - 你就不会看到它。
关于symfony而不是关于web的无状态本质(参见Why say that HTTP is a stateless protocol?)
答案 1 :(得分:0)
我开始考虑这个问题并将问题指向symfony-cmf上的routing issue。你用#symfony-cmf标记,我认为这对我们来说很重要。
我还认为,当您使用/my-route
保留路由时,您还应该向路由器询问该名称(或者如果CMF中包含具有该路由的内容对象。)
答案 2 :(得分:0)
如果您使用CmfRoutingBundle动态路由器,您应该将路由保留到学说。这里动态的想法是它们可以在运行时创建,例如在管理界面或其他地方的代码。 DynamicRouter从数据库加载路由。
如果您使用PHPCR-ODM,则路径名称是存储库ID,通常类似于/cms/routes/my-route
和you can generate it with that name。如果您有权访问从数据库加载的路由对象,您也可以从中生成,而不是路径。如果您必须对应用程序中的路径进行硬编码,则表明可能正常配置的路径可能更好。
如果您只是动态添加路由到路径集合,则必须确保在每个请求中都会发生这种情况,只有在添加它时才可以使用。使用CMF ChainRouter,您可以注册自己的路由器,但我不知道一个很好的用例。要么你知道路由,那么你可以在routing.xml | yml | php配置文件中配置它。或者路由是动态加载的,在这一点上你应该使用DynamicRouter,可能使用custom route loader。