Laravel路由URL与查询字符串

时间:2014-02-07 16:24:03

标签: php laravel

在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方法都使用这样的参数。如何使用查询字符串生成网址?

4 个答案:

答案 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.phpurl函数包含在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()
    }
}