带有可选参数的注释中的Symfony2路由

时间:2013-09-09 08:17:17

标签: symfony annotations router

我在控制器中创建了一个带有可选参数的路径,如下所示:

/**
 * League action
 *
 * @Route("/association/{assoc}/{league}", name="league", requirements={"league" = "\d+"}, defaults={"game" = null})
 * @Route("/association/{assoc}/{league}/{game}")
 * @Template()
 *
 * @param $assoc
 * @param $league
 * @param $game
 * @return array
 */
 public function leagueAction($assoc, $league, $game)

但如果我尝试使用此命名路由创建链接,则省略可选参数:

{{ path('league', {'assoc': association.short, 'league': league.id, 'game': g.id}) }}

结果链接

  

/关联/ BVNR / 7

我缺少什么?

1 个答案:

答案 0 :(得分:2)

在以下定义中,

* @Route("/association/{assoc}/{league}", name="league", requirements={"league" = "\d+"}, defaults={"game" = null})
* @Route("/association/{assoc}/{league}/{game}")

两个路由与您的操作相关,第一个路径(名为"league"没有任何默认参数,第二个未命名路径(因为您没有添加名称属性)也没有任何默认参数。

如何解决...

  • 在第二条路线中添加name并将其称为包含"game"参数的路径。
  • "game"参数的默认值移至第二条路线(因为它是唯一拥有game参数的路线。
  • (您实际上不需要定义两条路线,请查看我的答案的"How to improve ..."部分。)

试试这个......

 * @Route("/association/{assoc}/{league}/{game}", name="league_game", requirements={"league" = "\d+"}, defaults={"game" = null})

虽然您应该拨打"league_game"而不是"league"

{{ path('league_game', {'assoc': association.short, 'league': league.id, 'game': g.id}) }}

如何改进......

确保您确实需要定义两条路线,因为我建议只保留一条路线。

由于以下定义中存在"game"的默认值,

@Route("/association/{assoc}/{league}/{game}", name="league", requirements={"league" = "\d+"}, defaults={"game" = null}

然后涵盖两个版本,包含和不包含"game"