带有查询字符串的 Laravel 路由 url

2022-08-30 10:27:57

在 laravel 4 上,我可以使用 route() 帮助程序生成一个包含查询字符串的 url。但是在4.1上而不是:

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

我得到:

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

我做了一些研究,所有生成url的laravel方法都使用这样的参数。如何生成包含查询字符串的 URL?


答案 1

Laravel 和 helper 方法支持 URL 查询参数。不幸的是,帮助器方法没有。route()action()url()

只需为路由参数提供一个包含键值的数组。例如:

route('products.index', ['manufacturer' => 'Samsung']);

// Returns 'http://localhost/products?manufacturer=Samsung'

您仍然可以包含您的路由参数(例如 ID 和模型)来伴随这些参数:

route('products.show', [$product->id, 'model' => 'T9X']);

// Returns 'http://localhost/products/1?model=T9X'

基本上,数组中包含字符串键的任何元素都将被视为查询参数 ()。任何具有整数键的内容都将被视为 URL 参数 ()。/products?param=value/products/{arg}

此操作在操作方法中也受支持:

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

您还可以在 和 方法中提供查询参数:link_to_route()link_to_action()

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

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

2019 - 编辑

如果不能使用 或 ,则可以使用帮助程序生成具有查询参数的 URL:route()action()Arr::query()

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

// Returns 'http://localhost/products?manufacturer=Samsung'

艺术

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

// Returns 'http://localhost/products?manufacturer=Samsung'

或者创建一个简单的帮助程序函数:

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);
}

然后调用它:

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'

答案 2

附注。

我不同意鲍曼@Steve的想法(在他的答案中),即人们很少需要查询字符串网址,并认为Laravel至少应该考虑添加查询字符串功能(返回)。在很多情况下,当你想要一个查询字符串URL而不是一个基于参数的“漂亮的url”时。例如,复杂的搜索筛选器...

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

...可能指的是与啮齿动物相同的一组啮齿动物...

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

...但无论你如何看待它(编程,营销分析,SEO,用户友好性),这都有点可怕。即使。。。

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

...更长,更“丑陋”,实际上在这种不那么罕见的情况下更好。Net:友好的URL在某些方面很棒,查询字符串对其他事情也很好。

回答原始问题...

我需要一个“querystring”版本的 -- 所以我复制了函数,修改了它,然后把它卡在:url()/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;
}

例:

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

注意:该功能似乎是可插拔的,也就是说,您可以替换它。查看:函数被包装在一个条件中。但是你可能必须跳过箍才能做到这一点(即在其版本之前让laravel加载它。url()vendor/laravel/framework/src/Illuminate/Support/helpers.phpurlif ( ! function_exists('url'))

干杯

克里斯


推荐