我以前在SO上搜索过这个,但似乎给出的唯一答案是参数作为查询字符串传递的时候,这不是我想要的。
我的Symfony 3 CRM中有一个页面app_litter
。有一个名为litter_id
的必需URL slug需要传递给路由,以确定要显示的垃圾数据,如下所示:
/升/ 1
路由文件中的路由定义是:
app_view_litter:
path: /litter/{id}
defaults: { _controller: AppBundle:Litter:view, id: null }
requirements:
id: \d+
有一个功能允许用户将小狗添加到他们的垃圾中,这是本页之外的一种形式 - 一旦小狗成功保存,我想将用户重定向回有问题的垃圾,所以我做了这样:
return $this->redirectToRoute('app_litter', array('litter_id' => $litter->getId()));
其中$litter
是从Symfony检索的对象。但是,这会重定向到:
/升?litter_id = 1
哪个不起作用,因为它需要一个slu ..是否可以使用redirectToRoute()
(或任何其他方法)使用slug而不是查询字符串来呈现路径?
答案 0 :(得分:3)
因为您的路线定义是:
app_view_litter:
path: /litter/{id}
defaults: { _controller: AppBundle:Litter:view, id: null }
requirements:
id: \d+
使用路由生成器时,您需要提供一个关联数组,其中包含与占位符名称相对应的键id
。
因此,必须是:
$this->redirectToRoute('app_litter', array('id' => $litter->getId()));
如果你想使用一个slug,并且那里不仅包含数字(\d+
),你必须定义一条新路线或修改现有路线。
app_view_litter_using_slug:
path: /litter/{slug}
defaults: { _controller: AppBundle:Litter:view, slug: null }
requirements:
id: .*
你有类似的事情:
$this->redirectToRoute('app_litter_using_slug', array('slug' => $litter->getSlug()));
答案 1 :(得分:1)
你是否使用了错误的路线?尝试使用app_view_litter
代替app_litter
:
return $this->redirectToRoute('app_view_litter', array('id' => $litter->getId()));