我有一个包含多个参数的路由,我想在它为空时定义默认值。 我在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
不要犹豫,询问更多信息!
答案 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}
祝你好运