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

时间:2016-10-21 12:27:43

标签: symfony routes yaml

我有一个包含多个参数的路由,我想在它为空时定义默认值。 我在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 个答案:

答案 0 :(得分:1)

我可以看到您的要求regexp是错误的,或者与您在演示中尝试做的不匹配

requirements:
name_slug: '([a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*)'
tag_id: '\d+'
range_id: '\d+'
page: '\d+'

\d+表示您必须至少提供一个号码。 这解释了您在演示中获得的404响应代码。 使用\d*将解决此问题。您将被允许使用您正在输入的网址。

还有一件事,无关紧要。在PHP中,你应该首先提供没有默认值的参数,如下所述:php manual

希望它对你有所帮助。

答案 1 :(得分:0)

奇怪,因为你的选项参数/ {page}在你的例子中正常工作?它是第一个参数集 所以试试这个,并改变订单参数,也许......

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