Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel route url with query string

Tags:

php

laravel

On laravel 4 I could generate a url with query strings using the route() helper. But on 4.1 instead of:

$url = url('admin.events', array('lang' => 'en')); // admineventsurl/?lang=en 

I get:

$url = url('admin.events', array('lang' => 'en')); // admineventsurl/en 

I did some research and all laravel methods to generate url are using the parameters like that. How can I generate the url with query strings?

like image 303
Diego Castro Avatar asked Feb 07 '14 16:02

Diego Castro


People also ask

How can pass query string in URL in Laravel?

You can pass query string to URL in laravel using named route and controller action. You can pass query string as comma separated array to named route and controller action and redirect to URL.

How can you retrieve the full URL for the incoming request in Laravel?

Retrieving the Request URI The “path” method is used to retrieve the requested URI. The is method is used to retrieve the requested URI which matches the particular pattern specified in the argument of the method. To get the full URL, we can use the url method.

How do I find base URL in Laravel?

$uri = $request->path(); $url = $request->url(); $url = $request->fullUrl(); asset() app_path(); // ... Show activity on this post. You can use facades or helper function as per following. echo URL::to('/'); echo url();


2 Answers

Laravel's route() and action() helper methods support URL query params. The url() helper method, unfortunately does not.

Simply provide an array with key values to the route parameters. For example:

route('products.index', ['manufacturer' => 'Samsung']);  // Returns 'http://localhost/products?manufacturer=Samsung' 

You can also still include your route parameters (such as ID's and models) to accompany these parameters:

route('products.show', [$product->id, 'model' => 'T9X']);  // Returns 'http://localhost/products/1?model=T9X' 

Basically, any elements in the array that contain string keys will be treated as query parameter (/products?param=value). Anything with an integer key will be treated as a URL argument (/products/{arg}).

This is also supported in action methods:

action('ProductController@index', ['manufacturer' => 'Samsung']); 

You can also supply query parameters inside the link_to_route() and link_to_action() methods:

link_to_route('products.index', 'Products by Samsung', ['model' => 'Samsung');  link_to_action('ProductController@index', 'Products by Samsung', ['model' => 'Samsung']); 

2019 - EDIT:

If you can't use route() or action(), you can generate a URL with query params using the Arr::query() helper:

url('/products?').\Illuminate\Support\Arr::query(['manufacturer' => 'Samsung']);  // Returns 'http://localhost/products?manufacturer=Samsung' 

Or:

url('/products?').http_build_query(['manufacturer' => 'Samsung'], null, '&', PHP_QUERY_RFC3986);  // Returns 'http://localhost/products?manufacturer=Samsung' 

Or create a simple helper function:

use Illuminate\Support\Arr; use Illuminate\Support\Str;  function url_query($to, array $params = [], array $additional = []) {     return Str::finish(url($to, $additional), '?') . Arr::query($params); } 

Then call it:

url_query('products', ['manufacturer' => 'Samsung']);  // Returns 'http://localhost/products?manufacturer=Samsung'  url_query('products', ['manufacturer' => 'Samsung'], [$product->id]);  // Returns 'http://localhost/products/1?manufacturer=Samsung' 
like image 137
Steve Bauman Avatar answered Oct 05 '22 14:10

Steve Bauman


Side note.

I disagree with @Steve Bauman's idea (in his answer) that one rarely needs querystring urls, and think that Laravel should at least consider adding querystring functionality (back) in. There are plenty of cases when you want a querystring url rather than a param based "pretty url". For example, a complex search filter...

example.com/search/red/large/rabid/female/bunny 

...may potentially refer to the same exact set of rodents as...

example.com/search/bunny/rabid/large/female/red 

...but any way you look at it (programming, marketing analytics, SEO, user-friendliness), it's kinda terrible. Even though...

example.com/search?critter=bunny&gender=female&temperament=rabid&size=large&color=red 

...is longer and "uglier", it actually is better in this not-so-rare case. Net: Friendly URLs are great for some things, querystrings are great for others.

Answer to the original question...

I needed a "querystring" version of url() -- so I copied the function, modified it, and stuck it in /app/start/global.php:

/**  * Generate a querystring url for the application.  *  * Assumes that you want a URL with a querystring rather than route params  * (which is what the default url() helper does)  *  * @param  string  $path  * @param  mixed   $qs  * @param  bool    $secure  * @return string  */ function qs_url($path = null, $qs = array(), $secure = null) {     $url = app('url')->to($path, $secure);     if (count($qs)){          foreach($qs as $key => $value){             $qs[$key] = sprintf('%s=%s',$key, urlencode($value));         }         $url = sprintf('%s?%s', $url, implode('&', $qs));     }     return $url; } 

Example:

$url = qs_url('sign-in', array('email'=>$user->email)); //http://example.loc/sign-in?email=chris%40foobar.com 

Note: It appears that the url() function is pluggable, that is, you can replace it. Look in vendor/laravel/framework/src/Illuminate/Support/helpers.php: the url function is wrapped in a if ( ! function_exists('url')) conditional. But you would probably have to jump through hoops to do it (i.e. have laravel load it before its version.)

Cheers,

Chris

like image 29
Chris Carson Avatar answered Oct 05 '22 14:10

Chris Carson