有没有内置的方式来做这样的事情?
假设我有一个搜索页面,其中包含一些参数:
example.com/search?term=foo&type=user
该网页上的链接会重定向到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,而不是在查询字符串中。
答案 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)
URL::route('search', array(
'term' => Input::get('term'),
'link' => Input::get('type')
));
编辑:请务必在routes.php文件中命名路线:
Route::get('search', array('as' => 'search'));
即使您使用的是Route :: controller()
,这也会有效答案 3 :(得分:1)
如果您的路线有参数,您可以将它们作为第二个参数传递 路线方法。
在这种情况下,要返回像 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');