如何设置Symfony2路由以允许更多可选路径。
目前路由文件如下所示,控制器包含3个处理请求的操作。
MediaFilmBundle_film:
pattern: /films
defaults: { _controller: MediaFilmBundle:Film:index }
MediaFilmBundle_Film_Genre:
pattern: /films/genre/{genre_slug}
defaults: { _controller: MediaFilmBundle:Film:genre }
MediaFilmBundle_Film_Source:
pattern: /films/source/{source_slug}
defaults: { _controller: MediaFilmBundle:Film:source }
这项工作但是如何做得更好,或者除了Symfony2之外还有以下内容,是否可以执行以下操作,因此只有一个操作可以处理所有内容。
MediaFilmBundle_film:
pattern: /films/genre/{genre_slug}/source/{source_slug}
defaults: { _controller: MediaFilmBundle:Film:index }
上述路线应符合以下所有条件:
/films
/films/genre/horror
/films/source/america
/films/genre/action/source/england
理想情况下,它不应与以下内容匹配,或者控制器可以将其重定向到标准格式类型/../ source /.../ p>
/films/source/england/genre/action
可以使用现有结构匹配路线,如下所示:
MediaFilmBundle_Film_Genre_Source:
pattern: /films/genre/{genre_slug}/source/{source_slug}
defaults: { _controller: MediaFilmBundle:Film:genreSource }
这种方法的问题在于增加了更多的路段,需要更多的动作。
答案 0 :(得分:0)
默认参数可用于使slugs成为可选:
MediaFilmBundle_film:
pattern: /films/{type_one}/{value_one}/{type_two}/{value_two}
defaults: { _controller: MediaFilmBundle:Film:index, type_one: ""}
第一个可选项后的所有段落在默认情况下都是可选的,如果没有提供,将被设置为空值。在您的控制器中,您将必须实现逻辑以检查是否提供了type_one slug以及它是否为genre或source类型,然后解析value_one。然后检查是否提供了type_two slug,如果它是空白,则执行你对paths / films / genre / horror的逻辑。如果提供它解析类型和值并执行路径/电影/流派/动作/源/英格兰的逻辑
此处描述了可选的slu :: http://symfony.com/doc/current/book/routing.html#required-and-optional-placeholders
您可能还想查看动态路由器,如果您确实需要为动态数量的段塞工作:http://symfony.com/doc/current/cmf/bundles/routing/dynamic.html