0

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

理想情况下,它不应与以下内容匹配,否则控制器可以将其重定向到标准格式genre/../source/..

    /films/source/england/genre/action

可以使用现有结构匹配路由,如下所示:

MediaFilmBundle_Film_Genre_Source:
    pattern:  /films/genre/{genre_slug}/source/{source_slug}
    defaults: { _controller: MediaFilmBundle:Film:genreSource }

这种方法的问题是随着更多的 slug 添加更多的路线并且需要更多的操作。

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

1 回答 1

0

默认参数可用于使 slugs 可选:

MediaFilmBundle_film:
    pattern:  /films/{type_one}/{value_one}/{type_two}/{value_two}
    defaults: { _controller: MediaFilmBundle:Film:index, type_one: ""}

默认情况下,第一个可选项之后的所有 slug 都变为可选,如果未提供,则将设置为空值。在您的控制器中,您将必须实现逻辑来检查是否提供了 type_one slug 以及它是否属于类型或来源,然后解析 value_one。然后检查是否提供了 type_two slug,如果它是空白的,请执行路径 /films/genre/horror 的逻辑。如果提供了解析类型和值并执行路径 /films/genre/action/source/England 的逻辑

此处描述了可选的 slug:http: //symfony.com/doc/current/book/routing.html#required-and-optional-placeholders

如果您真的需要为动态数量的 slug 进行这项工作,您可能还想查看动态路由器:http: //symfony.com/doc/current/cmf/bundles/routing/dynamic.html

于 2014-07-25T15:13:49.713 回答