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

具有动态可选参数的Symfony路由,symfony,symfony-2.1,symfony-2.3,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+"} 问题是,当用户使用过滤器将结果缩小到所选城市时

我不熟悉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+"}
问题是,当用户使用过滤器将结果缩小到所选城市时,城市选项可用,如果城市不存在,则第二个参数应为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
是否有可能在路由文件中进行这些组合,或者解决这个问题的唯一方法是在控制器中编写自己的逻辑


谢谢。

您可以为同一操作定义两条路由。一个有城市,一个没有

像这样:

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+"}
首先将捕获所有这样的请求

head/slug/10 
head/slug
第二个会抓住你

head/slug/city
head/slug/city/10

可以为同一操作定义两个路由。一个有城市,一个没有

像这样:

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+"}
首先将捕获所有这样的请求

head/slug/10 
head/slug
第二个会抓住你

head/slug/city
head/slug/city/10

这听起来像是查询参数而不是属性的一个很好的用例。这要灵活得多,如果您想添加一个额外的参数呢?看看大多数ecom网站,他们在过滤产品中使用查询参数。@Luke是的,但我有一个要求,那个城市必须采用这种格式。我认为这主要是为了搜索引擎优化,其他过滤器参数将被定义为查询参数,正如你所建议的。这听起来像是查询参数而不是属性的一个很好的用例。这要灵活得多,如果您想添加一个额外的参数呢?看看大多数ecom网站,他们在过滤产品中使用查询参数。@Luke是的,但我有一个要求,那个城市必须采用这种格式。我认为这主要是为了搜索引擎优化,其他过滤参数将被定义为查询参数,正如你所建议的。谢谢,我要试试。谢谢,我要试试。