Symfony 3 - 具有多个可选参数的路由

3
我有一个带有多个参数的路由,当它为空时,我想定义默认值。 我在SO上没有找到类似的东西...
我的路由(yml):
app_product_show_range_tag:
path: 'list-range{range_id}-tag{tag_id}-{name_slug}/{page}'
methods: 'GET'
defaults:
    _controller: 'AppBundle:Product:showRangeTag'
    page: 1
    tag_id: 2
    range_id: null
requirements:
    name_slug: '([a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*)'
    tag_id: '\d+'
    range_id: '\d+'
    page: '\d+'

我的控制器(开始):

/**
 * Show a range
 * @ParamConverter("productRange", options={
"mapping": {"range_id": "productRangeId", "locale": "locale"},
"repository_method": "findOneById",
"map_method_signature" = true
})
 *     @ParamConverter("productTag", options={
"mapping": {"tag_id": "productTagId", "locale": "locale"},
"repository_method": "findOneById",
"map_method_signature" = true
})
 */
public function showRangeTagAction(ProductRange $productRange = null, ProductTag $productTag = null, string $name_slug, int $page)
{ [...]

我不明白问题出在哪里... 我定义了所有的默认值,控制器也是。

我在这个网址上做了一个快速演示: https://streamable.com/1paw

如果需要更多信息,请随时询问!

2个回答

1
根据我所看到的,您的正则表达式要求是错误的,或者与您在演示中尝试做的不匹配。
requirements:
name_slug: '([a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*)'
tag_id: '\d+'
range_id: '\d+'
page: '\d+'

\d+的意思是你必须提供至少一个数字。 这解释了你在演示中收到404响应代码的原因。 使用\d*将解决此问题。你将被允许使用你正在输入的网址。

还有一件事,与此无关。在PHP中,你应该首先提供没有默认值的参数,如此处所述:php手册

希望它能帮助你。


我知道这个,但是例如在页数(另一条路线)方面,我也有同样的问题,但它可以工作,SF3似乎会理解是否有页数。但是当我有更多的可选项时,什么都不起作用。(很难解释) - Snow
你好,只是出于好奇,如果你尝试这个,会发生什么?public function showRangeTagAction(ProductRange $productRange, ProductTag $productTag, string $name_slug, int $page) - Sinelc

0

很奇怪,因为你的可选参数 /{page} 在你的示例中运行良好?而且它是第一个设置的参数。所以尝试这个,并改变参数顺序,也许会有所改善...

defaults:  { _controller: 'AppBundle:Product:showRangeTag', page: 1, tag_id: 2, range_id: null}

祝你好运


没有,问题依旧 :( - Snow
嗯,你的yml文件中只有这个网址吗?也许另一个网址在它之前被调用了,会与你的网址发生冲突。尝试将你的网址放在yml文件的顶部。 - Sinelc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接