2017-06-01 150 views
1

我使用Symfony的CMF路由包来创建动态路由(我用一个例子在这里):Symfony的重定向到动态路由名称

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

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

响应从getResponseAction加载()函数中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'); 

} 

当我去'/动态网址',它的作品。

当另一个控制器,我想重定向到这个充满活力的路线,像这样:

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

但我得到这个错误:“链接的路由器中没有一个能够产生路线:路线“我-dynamic-route'not found“

另一个有趣的事情是:当我进入'/ dynamic-url'时,dev栏实际上表示路由名是'my-dynamic-route'。

编辑

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

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

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

回答

1

由于它是一个动态路由,它不会被保存在任何地方(如routing.yml),它只会在Request被定义的地方使用。因此,在请求您的应用程序结束时立即“忘记”关于在运行时生成的新路线。

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号这取决于你在哪里打电话$this->get('router')->getRouteCollection(); 只是尝试调用

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

在你的行动return语句,你要添加的my-dynamic-route路线之前。我相信你会在路线列表中看到你的my-dynamic-route,但是如果你在其他地方叫它 - 你不会看到它。

它不太了解一点symfony而有关Web的无状态(见Why say that HTTP is a stateless protocol?

+0

Thnx!动态路由确实“被遗忘”,而静态路由被保存。我切换到使用'LoaderInterface',所以路线被保存。我使用这个教程http://mmoreram.com/blog/2013/10/01/dynamic-routes-in-symfony2/ – BigJ

0

我开始思考这个问题,并指出你的问题的routing issue上的symfony-CMF。你用#symfony-cmf标记,我认为这对我们来说是重要的特性。

我也觉得,当你与/my-route坚持你的路线,你也应该问的路由器该名称(或者在CMF的情况下与该路线的内容对象。)

0

如果使用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