Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel routing url with variable order of parameters

Tags:

laravel-4

I am looking at routing to a Controller for GET URL whose parameters can vary in number or the order in which they appear in the URL. There could be many such combinations and I want to invoke the same controller action for all of these URLs

Examples of how my URLs could look like:

  1. Route::get('route1/id/{id}', 'Controller1@controllerAction1');
  2. Route::get('route1/id/{id}/name/{name}', 'Controller1@controllerAction1');
  3. Route::get('route1/name/{name}', 'Controller1@controllerAction1');
  4. Route::get('route1/id/{id}/name/{name}/orderby/{orderby}', 'Controller1@controllerAction1');
  5. Route::get('route1/id/{id}/orderby/{orderby}', 'Controller1@controllerAction1');

Also in the Controller action, I ultimately want to break this query string into an array. For the second example mentioned above, I want the query string id/{id}/name/{name} to be converted to array ('id' => {id}, 'name' => {name})

To invoke the same controller action for all different variations of the URLs, I have the following code in my routes.php:

Route::get('route1{all}', 'Controller1@controllerAction1')->where('all', '.*')

which seems to invoke the "controllerAction1" of Controller1 for the different types of URLs mentioned above.

And in the function controllerAction1, I am doing

$route_input = Route::input('all'); 
var_dump($route_input);
which prints "/id/1/name/xyz" when I hit http://example.com/laravel/public/route1/id/1/name/xyz

I would like to know if:

  1. Doing Route::get('route1{all}', 'Controller1@controllerAction1')->where('all', '.*') is the right method to invoke same action for variable combination of get parameters?
  2. Does Laravel offer any function to convert "/id/1/name/xyz" to array('id' => 1, 'name' => 'xyz') or I need to write custom function?
  3. Is there a better way to achieve my requirements?
like image 692
user3402821 Avatar asked Feb 04 '26 03:02

user3402821


2 Answers

  1. I believe not. Plus, in this way you won't be able to understand which values are being passed.

  2. Even if there is one, I think you don't actually need to pass the array. IMHO, I prefer to keep the items separate, then manipulate them from the controller. This is just my personal suggestion, but if you need an array of data, why don't you use a POST method? (the only right answer, is that you want the users to be able to save the link :P )

  3. The complicated part about your request, is that you want to keep everything under the same controller action, which messes the routes. I would try this (in your routes.php):

    Route::pattern('id', '[0-9]+');
    Route::pattern('name', '[a-Z]+');

    Route::get('route1/{id}/{name?}/{orderby?}', 'Controller1@controllerAction1');
    Route::get('route1/{name}/{orderby?}', 'Controller1@controllerAction1');

In this way:

  • you can have a route with just the ID, where NAME and ORDERBY are optional

  • if no ID is passed, you can have a route with only NAME, where ORDERBY is optional

Note how this is different from your URLs: it's much more complicated to put the routes as you wrote them id/{id}/name/{name}, than in the way I proposed {id}/{name}. If you need them exactly your way, why don't you call the links passing the variables from the GET function as follows? http://www.yoursite.com/route1?id=xxxx&name=yyyy&orderBy=zzzz

like image 192
clod986 Avatar answered Feb 06 '26 07:02

clod986


To have the route parameters convert from a set of individual parameters to an array that contains all the parameters in Laravel 5, you can call this from the Controller:

$routeParameters = $this->getRouter()->getCurrentRoute()->parameters()

For the route definition Route::get('route1/id/{id}/name/{name}', 'Controller1@controllerAction1'); if a user hits the route with the following: /route1/id/2/name/john

$routeParameters would equal array(id => 2, name => 'john')

like image 40
anotherprogrammer Avatar answered Feb 06 '26 07:02

anotherprogrammer



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!