Symfony2 route in annotations with optional parameters
In the following definitions,
* @Route("/association/{assoc}/{league}", name="league", requirements={"league" = "\d+"}, defaults={"game" = null})
* @Route("/association/{assoc}/{league}/{game}")
two routes are related to your action, the first one (named "league"
which doesn't have any default parameter and a second unnamed one (as you didn't add name attribute) which also doesn't have any default parameter.
How to fix ...
- Add a
name
to your second route and call it as it contains"game"
parameter. - Move the default value of
"game"
parameter to your second route (As it the only one to have agame
parameter. - (You don't really need to define two routes, take a look at the
"How to improve ..."
part of my answer).
Try this ...
* @Route("/association/{assoc}/{league}/{game}", name="league_game", requirements={"league" = "\d+"}, defaults={"game" = null})
While you should call "league_game"
instead of "league"
,
{{ path('league_game', {'assoc': association.short, 'league': league.id, 'game': g.id}) }}
How to improve ...
Make sure you really need to define two routes, because I would suggest keeping only one route.
As there's a default value for "game"
in the following definition,
@Route("/association/{assoc}/{league}/{game}", name="league", requirements={"league" = "\d+"}, defaults={"game" = null}
It then covers both versions, with and without "game"
.
Steffen Kamper
Updated on June 05, 2022Comments
-
Steffen Kamper almost 2 years
i created a route with optional parameter in controller like this:
/** * 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)
but if i try to create a link with this named route, the optional parameter is ommitted:
{{ path('league', {'assoc': association.short, 'league': league.id, 'game': g.id}) }}
resulting link is
/association/BVNR/7
What am i missing?
-
Steffen Kamper over 10 yearsah - naming second route did the trick. But i have to use defaults also with first route, as symfony claims about required parameter game. So this seems to work: * @Route("/association/{assoc}/{league}", name="league", requirements={"league" = "\d+"}, defaults={"game" = null}) * @Route("/association/{assoc}/{league}/{game}", name="leaguedetails", defaults={"game" = null})
-
Steffen Kamper over 10 yearsommitting first route doesn't work, i tried all combinations.
-
Ahmed Siouani over 10 yearsYou don't need to define "game" as a default parameter to your first route as it didn't contain any "game" parameter. Then, your first route should be called as follow: {{ path('league', {'assoc': association.short, 'league': league.id}) }} where league.id must fit the "\d+" constraint.
-
Steffen Kamper over 10 yearsAhmed - if i ommit defaults on first route, i get following error: Controller "...\LigaController::leagueAction()" requires that you provide a value for the "$game" argument (because there is no default value or because there is a non optional argument after this one). though in link generating for first route i don't use parameter game.
-
Ahmed Siouani over 10 yearsAh sorry, you're right, I didn't see your action signature. You need to set a value (default or not) for all the parameters used by leagueAction.
-
Steffen Kamper over 10 yearsah, ok - need to change function parameter to optional, then i can ommit defaults on first route: public function leagueAction($assoc, $league, $game = null)
-
Ahmed Siouani over 10 yearsExactly! As it's (well) explained here.
-
Emii Khaos over 10 yearsbtw, you don't need two route definitions. Because only
game
is optional, one defintion is enough:@Route("/association/{assoc}/{league}/{game}", name="league", requirements={"league" = "\d+"}, defaults={"game" = null})
. Generate both versions with or without game parameter trough theleague
route. -
Ahmed Siouani over 10 yearsYeah, sure. As suggested in the "Also ..." part of my answer. Thanks for making it clearer.
-
Emii Khaos over 10 yearsJep, maybe it would be worth an edit, to make this clear. Especially for other users, which are searching on similar issue, that only one route is enough.