在Symfony2中的路线

时间:2012-05-16 15:46:09

标签: resources symfony routing requirements

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

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

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

这是一个错误吗?

4 个答案:

答案 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中,所有工作都按预期进行。