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

时间:2014-02-08 18:32:43

标签: laravel laravel-4

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

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

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

该网页上的链接会重定向到typelink的网址。我正在寻找一种方法,无需手动构建URL。

修改
我可以手动构建URL:

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

但是,我想知道的是,如果在Laravel中有一个更好的内置方法,因为当我想要更改其中一个值时,代码变得更加混乱。

为URL生成器提供第二个参数($parameters)将它们作为段添加到URL,而不是在查询字符串中。

6 个答案:

答案 0 :(得分: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()

答案 1 :(得分:4)

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

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

要添加或覆盖type参数,请删除term

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

生成路线时的用法:

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

答案 2 :(得分:2)

您可以使用Laravel's URLGenerator

执行此操作
URL::route('search', array(
  'term' => Input::get('term'),
  'link' => Input::get('type')
));

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

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

即使您使用的是Route :: controller()

,这也会有效

答案 3 :(得分:1)

来自Laravel documentation

  

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

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

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

答案 4 :(得分:0)

是的,有一种内置的方式。您可以在Middleware中进行操作。

传递给所有中间件的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);
}

答案 5 :(得分:-2)

Input组件还应包含查询参数。

Input::get('foo');