2

在一些 symfony2 项目中,我有下一个路由定义:

MyBundle_Default:
    resource: "routing/default.yml"
    prefix: /{slug}-{resource_id}
    requirements:
        slug: "[a-z\-]+"
        resource_id: "\d+"

但是这个要求是行不通的。例如,如果我在 slug 中有“-”(例如“test-route”),那么 url/test-route-9就不起作用了。

这是一个错误吗?

4

4 回答 4

2

主要是,我认为您的问题来自破折号字符。让我解释。假设输入的 url 是/test-route-9. 根据您的要求,匹配的蛞蝓将是test-route-因为您的正则表达式指出之间的字符或可以匹配a-z的破折号。-

正则表达式将匹配它可以匹配的所有内容,因此它将“吃掉”破折号字符。通过“吃掉”它,剩下的只是9不正确的,因为路由在匹配该resource_id部分之前需要另一个破折号。因此,此 url 不会像您期望的那样匹配。

简单的解决方法是用 a/而不是破折号分隔组件,或者更改分隔 slug 的字符以将其与 url 组件分隔符区分开来。

通过更改 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+"

我很确定问题来自于此。没有测试任何东西,但值得一试,以确保问题出在破折号分隔符上。

于 2012-05-16T15:59:33.967 回答
0

这是一个错字,您将要求放在 hotel_id 上,但在 url resource_id 中定义!

于 2012-05-16T15:47:44.530 回答
0

尝试

slug: "[a-z\-]+(?<!-)"

这将确保正则表达式与最后一个破折号不匹配,这是 Matts 回答中提到的问题。

我希望这个对你有用 :)

于 2012-05-16T17:28:20.257 回答
0

看起来这确实是一个错误。至少在 Symfony 3.4.36 中,一切都按预期工作。

于 2019-12-16T23:34:53.430 回答