有没有内置的方法来做这样的事情?
假设我有一个搜索页面,其 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,而不是添加到查询字符串中。
您可以使用 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()
我更喜欢原生 PHP 数组合并来覆盖一些参数:
['type' => 'link'] + \Request::all()
要添加或覆盖
type
参数并删除另一个 term
:
['type' => 'link'] + \Request::except('term')
生成路线时的用法:
route('movie::category.show', ['type' => 'link'] + \Request::all())
你可以使用 Laravel 的 URLGenerator
来做到这一点URL::route('search', array(
'term' => Input::get('term'),
'link' => Input::get('type')
));
编辑:请务必在您的routes.php文件中命名路线:
Route::get('search', array('as' => 'search'));
即使您使用 Route::controller() 也可以工作
来自 Laravel 文档:
如果你的路由有参数,你可以将它们作为第二个参数传递 到路线方法。
在这种情况下,要返回像 example.com/search?term=foo&type=user 这样的 URI,您可以使用这样的重定向功能:
return redirect()->route('search', ['term' => 'foo', 'type' => 'user']);
是的,有一种内置方法。您可以在中间件中进行操作。
传递给所有中间件的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);
}
输入组件还应包含查询参数。
即
Input::get('foo');