Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 带有查询字符串的Laravel路由url_Php_Laravel - Fatal编程技术网

Php 带有查询字符串的Laravel路由url

Php 带有查询字符串的Laravel路由url,php,laravel,Php,Laravel,在Laravel4上,我可以使用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方法都使用了这样的参数。如

在Laravel4上,我可以使用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方法都使用了这样的参数。如何使用查询字符串生成url?

Laravel的
route()
action()
助手方法支持url参数。不幸的是,
url()
helper方法没有

只需提供一个数组,其中包含路由参数的键值。例如:

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'
基本上,数组中包含字符串键的任何元素都将被视为查询参数(
/products?param=value
)。任何带有整数键的内容都将被视为URL参数(
/products/{arg}

在操作方法中也支持这一点:

action('ProductController@index', ['manufacturer' => 'Samsung']);
您还可以在
link\u to\u route()和
link\u to\u action()方法中提供查询参数:

link_to_route('products.index', 'Products by Samsung', ['model' => 'Samsung');

link_to_action('ProductController@index', 'Products by Samsung', ['model' => 'Samsung']);
2019年-编辑

如果您没有路由名称,或者不喜欢使用
action()
,只需使用:

url('/products?').\Illuminate\Support\Arr::query(['manufacturer' => 'Samsung']);

// Returns 'http://localhost/products?manufacturer=Samsung'
或:

或创建一个简单的辅助函数:

use Illuminate\Support\Arr;
use Illuminate\Support\Str;

function url_query($to, array $params = [], array $additional = []) {
    return Str::finish(url($to, $additional), '?') . Arr::query($params);
}
private function registerRestfulController($prefix, $controllerClass)
{
    Route::controller($prefix, $controllerClass, $controllerClass::getRouteNames());
}
那就叫它:

url_query('products', ['manufacturer' => 'Samsung']);

// Returns 'http://localhost/products?manufacturer=Samsung'

url_query('products', ['manufacturer' => 'Samsung'], [$product->id]);

// Returns 'http://localhost/products/1?manufacturer=Samsung'

旁注。

我不同意@ Steve Bauman的想法(在他的回答)中,很少需要查询字符串URL,并且认为Laravel至少应该考虑添加QuiSQL字符串功能(Read)。在很多情况下,您需要的是查询字符串url,而不是基于参数的“漂亮url”。例如,一个复杂的搜索过滤器

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
…更长更“丑”,在这种并不罕见的情况下实际上更好。Net:友好的URL对某些方面很好,查询字符串对其他方面很好

对原始问题的回答…

我需要一个“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/illumb/Support/helpers.php
:如果(!function_存在('url'))
条件,则
url
函数包装在
中。但是你可能需要跳转才能完成(也就是说,让laravel在它的版本之前加载它)

干杯


克里斯

以下是我需要做的:

我在服务提供商中处理我的所有路由,在那里我定义了以下功能:

use Illuminate\Support\Arr;
use Illuminate\Support\Str;

function url_query($to, array $params = [], array $additional = []) {
    return Str::finish(url($to, $additional), '?') . Arr::query($params);
}
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默认值。一旦您运行此命令,它会自动开始使用查询字符串变量,我发现在本例中,查询字符串变量比路径变量更可取。

一种简单的方法,特别是与jQuery Autocomplete一起使用,它可以使用一个条件修改控制器,以检查$request中是否有“term”:

(控制器文件)


谢谢你的回答。我真的很喜欢它,但因为你的问题实际上并没有回答我的问题,我很感激。我不同意-url路径应该只包含特定资源的参数,查询字符串参数可以用一些非必要的方式修改该请求。可以说,用不同语言呈现的页面是一种完全不同的资源,而不是一种修改过的版本,但我不接受这一点。不管SEO技巧如何,语义都是构建应用程序最重要的部分,我觉得这是一种非语义方法。@DiegoCastro看一下我下面的答案-它有助于以标准的Laravel方式设置路由,但不会创建全局函数或避免框架。我很想听听你的想法。