【问题标题】:Symfony2 Routing Optional PathsSymfony2 路由可选路径
【发布时间】:2014-09-17 11:38:41
【问题描述】:

如何设置 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 蛞蝓 = ...

【问题讨论】:

    标签: symfony symfony-2.5


    【解决方案1】:

    默认参数可用于使 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

    【讨论】:

    • 谢谢,我可能会改变我做事的方式,这有点不像我希望的那样优雅。但这很重要。
    猜你喜欢
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2014-11-23
    • 2016-04-10
    • 2011-07-18
    • 1970-01-01
    相关资源
    最近更新 更多