在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方法都使用这样的参数。如何使用查询字符串生成网址?
答案 0 :(得分:34)
Laravel的route()
和action()
辅助方法支持URL参数。遗憾的是,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'
行动方法也支持这一点:
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']);
答案 1 :(得分:30)
旁注。
我不同意@Steve Bauman的想法(在他的回答中),很少需要查询字符串网址,并且认为Laravel至少应该考虑添加查询字符串功能(返回)。有很多情况下你想要一个查询字符串网址,而不是一个基于param的"漂亮网址"。例如,复杂的搜索过滤器......
example.com/search/red/large/rabid/female/bunny
......可能会将同一组精确的啮齿动物称为......
example.com/search/bunny/rabid/large/female/red
...但是你看它的任何方式(编程,营销分析,搜索引擎优化,用户友好性),它有点可怕。即使......
example.com/search?critter=bunny&gender=female&temperament=rabid&size=large&color=red
...更长,而且更糟糕的是,在这个不那么罕见的情况下它实际上更好。网:友情网址对某些东西很有用,查询字符串对其他人来说很棒。
回答原来的问题......
我需要一个" 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
注意:url()
函数似乎是可插入的,也就是说,您可以替换它。查看vendor/laravel/framework/src/Illuminate/Support/helpers.php
:url
函数包含在if ( ! function_exists('url'))
条件中。但是你可能不得不跳过篮球去做(也就是在它的版本之前加载laravel。)
干杯,
克里斯
答案 2 :(得分:1)
以下是我需要做的事情:
我处理服务提供商中的所有路由,我在其中定义了以下功能:
private function registerRestfulController($prefix, $controllerClass)
{
Route::controller($prefix, $controllerClass, $controllerClass::getRouteNames());
}
getRouteNames
是我的BaseController上的一个静态方法,它通常返回路由,以便RESTful控制器可以有自动命名路由。
我遇到的问题是,这定义了路由本身的通配符匹配器集 - 为了避免这种情况,我将以下内容添加到上面的私有函数中:
foreach ($controllerClass::getRoutesNames() as $name) {
$route = Route::getRoutes()->getByName($name);
$cleanUri = preg_replace('/\/\{\w*\?\}/', '', $route->getUri());
$route->setUri($cleanUri);
}
这会加载您当时注册的所有路由,并立即从URI中删除通配符。您可以轻松传递布尔值或"白名单"您想要保留通配符的路由名称,以便它不会无意地踩踏Laravel默认值。一旦你运行它,它会自动开始使用查询字符串变量,我发现远比这个实例中的路径变量更好。
答案 3 :(得分:-1)
一个简单的方法来做到这一点,特别是与 jQuery 自动完成一起使用,它是修改控制器的条件来检查 $request 中是否有 'term':
(控制器文件)
public function list_for_autocomplete(Request $request)
{
if ($request->has('term')) {
return YourModel::select('column_name as value')
->where('column_name', 'like', '%' . $request->input('term') . '%')
->get()
}
}