Routing in Symfony2: optional parameter en four urls for one route
10,351
Here's a way to do this
routing.yml
report:
pattern: /report/{days}
defaults: { _controller: "AppReportBundle:Report:dayReport", days: null }
requirements:
days: -?\d+
report_reroute:
pattern: /report/
defaults:
_controller: FrameworkBundle:Redirect:redirect
route: report
permanent: true
Since requirements is a regexp pattern it lets you have a negative number.
The reroute section forces the route /report/
to redirect on /report
You can read about this on: Cookbok Entry - Elnur's Answer
With such behaviour, you would have:
Route | Action | Parameters
------------|------------------------|-------------
/report | dayReportAction | $days = null
/report/ | 301 to /report |
/report/60 | dayReportAction | $days = 60
/report/-4 | dayReportAction | $days = -4
/report/foo | 404 |
Related videos on Youtube
Comments
-
Paul Maclean over 1 year
In my Symfony2 application I would like to make four urls possible with one route:
- a-lot-of-other-stuff/report/-20 (negative number)
- a-lot-of-other-stuff/report/40 (positive number)
- a-lot-of-other-stuff/report/ (no number)
- a-lot-of-other-stuff/report (no number and no / )
My route currently looks like this:
report: pattern: /report/{days} defaults: { _controller: "AppReportBundle:Report:dayReport", days = null }
The action is defined as:
public function dayReportAction($days = null) { // my code here }
This currently makes url 1 and 2 working but in the case of url 3 and 4, I get an error
Route not found
How can I make the parameter "days" optional?
And if the parameter is not provided, how can I allow the/
to be omitted as well?-
jkucharovic almost 11 yearsYour route config should be:
defaults: { _controller: "AppReportBundle:Report:dayReport", days: null }
-
Felix Aballi about 10 yearsIs it possible to supress other parts in route in the order is referred, for instance, using previous routes: 'a-lot-of-other-stuff/report/40', where '/report/' could be optional so the ending would be: 'a-lot-of-other-stuff/40', asuming that I have default behaviors included in my routes? How could we achieve this?
-
Touki about 10 years@Félix You would want to create a new route to the same controller action. If you're interested in a full answer, you should create a new question.
-
Felix Aballi about 10 yearsI've created a new question here, please visit it: stackoverflow.com/questions/21766700/…