在 Laravel 中更改查询参数时重定向到当前 URL

问题描述 投票:0回答:6

有没有内置的方法来做这样的事情?

假设我有一个搜索页面,其 URL 中有一些参数:

example.com/search?term=foo&type=user

该页面上的链接将重定向到一个 URL,其中

type
link
。我正在寻找一种无需手动构建 URL 即可完成此操作的方法。

编辑:
我可以像这样手动构建 URL:

$qs = http_build_query(array(
    'term' => Input::get('term'),
    'type' => Input::get('type')
));
$url = URL::to('search?'.$qs);

但是,我想知道 Laravel 中是否有更好的内置方法来执行此操作,因为当我想要更改其中一个值时,代码会变得更加混乱。

为 URL 生成器提供第二个参数 (

$parameters
),将它们作为段添加到 URL,而不是添加到查询字符串中。

php laravel laravel-4
6个回答
8
投票

您可以使用 URL 生成器来完成此操作。假设搜索是一条命名路线:

$queryToAdd = array('type' => 'user');
$currentQuery = Input::query();

// Merge our new query parameters into the current query string
$query = array_merge($queryToAdd, $currentQuery);

// Redirect to our route with the new query string
return Redirect::route('search', $query);

Laravel 将从传递的数组中取出位置参数(这似乎不适用于此场景),并将其余部分作为查询字符串附加到生成的 URL。

参见:

URLGenerator::route()
URLGenerator::replaceRouteParameters()
URLGenerator::getRouteQueryString()


7
投票

我更喜欢原生 PHP 数组合并来覆盖一些参数:

['type' => 'link'] + \Request::all()

要添加或覆盖

type
参数并删除另一个
term
:

['type' => 'link'] + \Request::except('term')

生成路线时的用法:

route('movie::category.show', ['type' => 'link'] + \Request::all())

2
投票

你可以使用 Laravel 的 URLGenerator

来做到这一点
URL::route('search', array(
  'term' => Input::get('term'),
  'link' => Input::get('type')
));

编辑:请务必在您的routes.php文件中命名路线:

Route::get('search', array('as' => 'search'));

即使您使用 Route::controller() 也可以工作


1
投票

来自 Laravel 文档

如果你的路由有参数,你可以将它们作为第二个参数传递 到路线方法。

在这种情况下,要返回像 example.com/search?term=foo&type=user 这样的 URI,您可以使用这样的重定向功能:

return redirect()->route('search', ['term' => 'foo', 'type' => 'user']);

0
投票

是的,有一种内置方法。您可以在中间件中进行操作。

传递给所有中间件的handle方法的

$request
都有一个
query
属性。作为一个 InputBag,它带有一些方法;即,为了您的意图:
->set()

非常不言自明,但这里有一个例子:

public function handle(Request $request, Closure $next)
{
    $request->query->set('term','new-value');

    // now you pass the request (with the manipulated query) down the pipeline.
    return $next($request);
}

-3
投票

输入组件还应包含查询参数。

Input::get('foo');

© www.soinside.com 2019 - 2024. All rights reserved.