【问题标题】:Symfony2 optional route parameters with keysSymfony2 带键的可选路由参数
【发布时间】:2014-11-23 18:09:01
【问题描述】:

在 symfony2 routing.yml 中,我尝试使用如下可选参数创建路由:

/app/type/{typeValue}/page/{page}

所以,一个可行的例子是:

/app/test/type/hello/page/1

我的路线是:

api_test:
    pattern:   /api/test/type/{typeValue}/page/{page}
    defaults: { _controller: TestCoreBundle:Json:test, page:1 }    

这很好,但我希望 /type/{typeValue} 和 /page/{page} 是可选的,因此它也适用于这样的网址:

/app/test
/app/test/page/3
/app/test/type/myType

我的其他路由也会包含更复杂的可选参数,所以解决这个问题对我来说很重要。我需要做什么才能不需要创建单独的路线以支持每个组合?

【问题讨论】:

    标签: php symfony routing


    【解决方案1】:

    正如symfony page 中解释的那样,可选占位符之后的所有内容也必须是可选的。

    当然,您可以拥有多个可选占位符(例如 /blog/{slug}/{page}),但在可选占位符之后的所有内容 必须是可选的。例如,/{page}/blog 是有效路径,但页面 将始终需要(即简单地 /blog 将不匹配此路由)。

    在您的情况下,{typeValue} 是可选的,但后面是 /page/,这不是可选的,因此此 rout 永远不会与两个可选参数一起使用。 您可以使用查询字符串或将您的路线更改为类似

    api_test:
        pattern:   /api/test/{typeValue}/{page}
        defaults: { _controller: TestCoreBundle:Json:test, typeValue: 'default', page: 1 }
        requirements:
            page:  \d+
    

    然后你就可以使用路线了

    /app/test
    /app/test/myType
    /app/test/myType/3
    

    但即便如此路由/app/test/3 也是不可能的,因为symfony 会将其解释为$typeValue = 3$page 作为默认值。

    【讨论】:

      【解决方案2】:

      动态路由参数仍然需要填充或默认,我建议将这些作为选项传递,然后附加到查询字符串,例如 ?page=1&myType=blah 并在您的控制器基类中使用 $request->get() .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 2013-06-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多