3

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?

2 Answers 2

2
  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

Sign up to request clarification or add additional context in comments.

3 Comments

Thanks for your response. I liked your suggestions. I would try yoursite.com/route1?id=xxxx&name=yyyy&orderBy=zzzz format.
@user3402821 you are welcome :) can you accept the answer please? Otherwise others will waste time answering
I am going to follow yoursite.com/route1?id=xxxx&name=yyyy&orderBy=zzzz format. thanks for answering
1

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')

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.