具有动态可选参数的Symfony路由

Dei*_*sJJ 1 symfony symfony-2.1 symfony-2.3

我是Symfony框架的新手。目前,我在mybundle / Resources / config / routing.yml中有路由:

fcr_category_head:
  path: head/{slug}/{city}/{page}
  defaults: { _controller: AppBundle:Head:index, slug: "", city: "all", page: 1 }
  requirements: {page: "\d+"}
Run Code Online (Sandbox Code Playgroud)

问题在于,city当用户使用过滤器将结果缩小到所选城市时,该选项可用,如果city不存在,则第二个参数应为page。

因此路线变化可以像这样:

head/slug/city //default page 1 if city is not a number, if number then it is page
head/slug/city/10 //e.g page 10
head/slug/10 //no city parameter, because it is number, page 10
Run Code Online (Sandbox Code Playgroud)

是否可以在路由文件中进行这些组合,或者解决此问题的唯一方法是在控制器中编写自己的逻辑?

谢谢。

paz*_*ulx 5

您可以为同一动作定义两条路线。一个带城市,一个不带城市。

像这样:

fcr_category_head:
  path: head/{slug}/{page}
  defaults: { _controller: AppBundle:Head:index, slug: "", city: "all", page: 1 }
  requirements: {page: "\d+"}

fcr_category_head_with_city:
  path: head/{slug}/{city}/{page}
  defaults: { _controller: AppBundle:Head:index, slug: "", city: "all", page: 1 }
  requirements: {page: "\d+", city: "\w+"}
Run Code Online (Sandbox Code Playgroud)

首先将像这样捕获所有请求

head/slug/10 
head/slug
Run Code Online (Sandbox Code Playgroud)

第二会抓住

head/slug/city
head/slug/city/10
Run Code Online (Sandbox Code Playgroud)