【问题标题】:Symfony redirect to route passing url slugSymfony 重定向到路由传递 url slug
【发布时间】:2026-01-02 05:00:01
【问题描述】:

我之前在 SO 上搜索过这个,但似乎给出的唯一答案是当参数作为查询字符串传递时,这不是我想要的。

我的 Symfony 3 CRM 中有一个带有路由 app_litter 的页面。有一个必需的 URL slug 称为 litter_id,需要将其传递给路由以确定要显示哪些垃圾数据,如下所示:

/litter/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?litter_id=1

这不起作用,因为它需要一个蛞蝓。是否可以使用redirectToRoute()(或任何其他方法)以 slug 而不是查询字符串来呈现路由?

【问题讨论】:

  • 显示您的路线定义。
  • @BorisGuéry 已将其添加到问题中。

标签: symfony redirect


【解决方案1】:

因为你的路由定义是:

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()));

【讨论】:

  • 嗯,好吧,我错过了 - 但即使我使用 litter?id=1 它仍然失败,因为它认为 id id 为空。错误是调用成员函数 getBlah() on null
  • 当你的路径应该是 litter/1 时,为什么要使用 litter?id=1 ?能否提供完整的操作代码
  • @MichaelEmerson 它可能会失败,因为它不应该匹配任何有效的路线,/litter?id={id} 与您的实际要求不匹配 /litter/{id}
  • @BorisGuéry 是的,我知道它因此而失败!这就是为什么我问这个问题,如何将它作为 URL 中的 slug 传递!
  • @MichaelEmerson,已编辑。不过,我实际上建议您深入了解Routing 组件的工作原理。
【解决方案2】:

会不会是你走错路线了?尝试使用app_view_litter 而不是app_litter

return $this->redirectToRoute('app_view_litter', array('id' => $litter->getId()));

【讨论】:

  • 不,路线没有错。这是单独的页面,而不是所有垃圾的列表。
  • 正如鲍里斯指出的那样,您应该使用id 作为参数并查看您的路线定义,路线名称应为app_view_litter。我会更新答案。
  • 这仍然不起作用。我要说明的一点是,它将它作为查询字符串传回,而不是 URL 中的 slug。
  • 听起来像路由匹配未定义该参数的调用。因此,如果您使用上面的调用生成 url,您会被重定向到 /litter?id={id} 吗?是否为 litter 术语配置了其他路由?