Symfony重定向到动态路由名称

时间:2017-06-01 00:48:40

标签: symfony symfony-cmf symfony-routing

我使用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();

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

3 个答案:

答案 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-routeyou can generate it with that name。如果您有权访问从数据库加载的路由对象,您也可以从中生成,而不是路径。如果您必须对应用程序中的路径进行硬编码,则表明可能正常配置的路径可能更好。

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