带键的Symfony2可选路由参数

时间:2014-09-29 11:03:49

标签: php symfony routing

在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

我的其他路线也会包含更复杂的可选参数,因此解决此问题对我来说非常重要。我需要做什么,以便我不需要创建单独的路线,因此它支持每一个组合?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

symfony page所述,可选占位符之后的所有内容也必须是可选的。

  

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

在您的情况下,{typeValue}是可选的,但后跟/page/,这不是可选的,因此此路径永远不会同时使用这两个参数。 您可以使用查询字符串或将路由更改为

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作为默认值。