在某个symfony2项目中,我有下一个路由定义:
MyBundle_Default:
resource: "routing/default.yml"
prefix: /{slug}-{resource_id}
requirements:
slug: "[a-z\-]+"
resource_id: "\d+"
但是这个要求不起作用。
例如,如果我在slug中有“ - ”(例如“test-route”),那么像/test-route-9
这样的网址就不起作用了。
这是一个错误吗?
答案 0 :(得分:2)
主要是,我认为你的问题来自破折号字符。让我解释。假设输入的网址为/test-route-9
。根据您的要求,匹配的段塞将为test-route-
,因为您的正则表达式表明可以匹配的a-z
或短划线-
之间的字符。
正则表达式会匹配它所能做的每一件事,所以它会“吃掉”破折号字符。通过“吃”它,剩下的只有9
这是不正确的,因为路由在匹配resource_id
部分之前需要另一个破折号。因此,此网址与您期望的不匹配。
简单修复是使用/
而不是破折号分隔组件,或更改分隔符号的字符以将其与url组件分隔符区分开来。
通过更改网址中的分隔符进行修复:
prefix: /{slug}/{resource_id}
requirements:
slug: "[a-z\-]+"
resource_id: "\d+"
或者:
prefix: /{slug}_{resource_id}
requirements:
slug: "[a-z\-]+"
resource_id: "\d+"
通过直接更改slug的分隔符来修复:
prefix: /{slug}-{resource_id}
requirements:
slug: "[a-z_]+"
resource_id: "\d+"
我很确定问题来自于此。没有测试任何东西,但值得一试只是为了确定问题出在破折号字符分隔符上。
答案 1 :(得分:0)
这是一个错字,你把要求放在hotel_id上,但在url resource_id中定义!
答案 2 :(得分:0)
尝试
slug: "[a-z\-]+(?<!-)"
这将确保正则表达式与最后一个破折号不匹配,这是Matts答案中提到的问题。
我希望它适合你:)
答案 3 :(得分:0)
看起来确实是一个错误。至少在Symfony 3.4.36中,所有工作都按预期进行。