【问题标题】:Symfony route with several optional params带有几个可选参数的 Symfony 路由
【发布时间】:2016-06-30 11:02:48
【问题描述】:

首先感谢您的阅读。我遇到了 Symfony 路由的问题。我有一个接收多个参数的路由:

my_route:
    path:     /route/{page}/{paramA}/{paramB}/{paramC}
    defaults: { _controller: MyBundle:MyController:index, page: null, paramA: null, paramB: null, paramC: null }

问题在于“参数”。它是一个过滤结果的文本,它可以不设置,但“paramB”和“paramC”可以。

所以我需要这条路线来处理例如:

/route/1/paramB/paramC

并在控制器中接收:

paramA = null, paramB="paramB", paramC="paramC"

现在当我处理:

/route/1/paramB/paramC

我在控制器中得到了这个:

paramA="paramB", paramB="paramC", paramC=null

欢迎任何帮助。再次感谢。

【问题讨论】:

  • 我不知道你是如何设想的。当你写 URL 的时候你可能知道哪个参数应该是哪个,但是接收请求的 Symfony 控制器怎么知道呢?您必须选择不同的默认值,并相应地填写 URL。
  • 我知道当我写 url 时参数是 wich。问题是当它是文本并且它是空的时它没有写,例如: 过滤的用户类型:/route/1/textToFind/paramB/paramC 没有问题,我知道“textToFind”是paramA。但是如果他/她只通过 paramB 和 paramC 过滤,那么路由是: /route/paramB/paramC paramB 的值存储在 paramA 中。这是我尽量避免的。

标签: php symfony routes optional-parameters


【解决方案1】:

像这些用于过滤、排序和分页的可选参数应该作为查询参数传递,路由参数应该只指向所需的资源。

所以:

/article?page=0&limit=10

不是:

/article/0/10

或者:

/user?active=1

不是:

/user/1

等等。

如果您有一个复杂的示例,请与我们分享。

【讨论】:

  • 这正是我正在寻找的,但我不知道如何在 Symfony2 上做到这一点。你有什么线索吗?
  • 您能分享一个示例控制器吗?如果您扩展 Controller 类,您可以通过以下方式访问查询参数:$this->request->query->get(KEY)
  • 您需要整个控制器吗?或者只是几行。很大,所以才问。当我回到家时,我会发布一个例子。谢谢你的一切:)
  • 整个控制器会更好。您可以跳过一些有价值的部分(对我们而言),因为您认为它们并不重要。将其发布在 pastebin(或类似的东西)上,也许我们可以帮助您进行重构以使其整体更好。
【解决方案2】:

这是无法做到的。正如 Symfony 文档中提到的

您可以有多个可选的占位符,
但之后的所有内容 可选占位符必须是可选的。

您已将以下内容添加到默认键中,

page: null, paramA: null, paramB: null, paramC: null

所以page 之后的所有内容都应该在 URL 中,paramA 也是如此。因此,当您想跳过一个值时,您必须在您的情况下跳过以下值。

参考:http://symfony.com/doc/current/book/routing.html#adding-requirements

【讨论】:

  • 嗯,其实“paramB”和“paramC”也是可选的。我需要类似通常的网址:/route/1?paramA=paramA&paramB=paramB&paramC=paramC
  • 是的,这是真的,但您不能跳过该参数。检查我更新的答案。
猜你喜欢
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 2020-04-20
  • 2014-03-17
  • 1970-01-01
  • 2023-03-03
  • 2016-10-12
相关资源
最近更新 更多