【问题标题】:Routes in Symfony2Symfony2 中的路由
【发布时间】:2012-05-16 15:46:08
【问题描述】:

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

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

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

这是一个错误吗?

【问题讨论】:

    标签: resources symfony routing requirements


    【解决方案1】:

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

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

    简单的解决方法是使用 / 而不是破折号分隔组件,或者更改分隔 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+"
    

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

    【讨论】:

    • 谢谢,但在之前的回答中,我评论了工作结构。同样,我需要使用模式 {slug}-{resource_id}(不带斜线和下划线)。
    【解决方案2】:

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

    【讨论】:

    • 能否也提供default.yml的内容?
    • 没关系。有没有参数的常规路线。如果我将它们放入主路由文件(不使用路由导入资源) - 我会得到工作结构,但有很多我不想要的“复制粘贴”。
    【解决方案3】:

    试试

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

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

    我希望它对你有用:)

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-18
        • 1970-01-01
        • 2016-03-10
        • 2012-10-13
        • 1970-01-01
        • 1970-01-01
        • 2014-09-17
        • 2016-04-13
        相关资源
        最近更新 更多