Symfony2路由可选路径

时间:2014-07-25 15:01:36

标签: symfony symfony-2.5

如何设置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 }

这种方法的问题在于增加了更多的路段,需要更多的动作。

  • 1 slug = 2个路线和行动
  • 2 slugs = 4条路线和行动
  • 3个slugs = 8个路线和行动
  • n slugs = ...

1 个答案:

答案 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