Php 带有查询字符串的Laravel路由url
在Laravel4上,我可以使用route()助手生成带有查询字符串的url。但在4.1上,而不是: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方法都使用了这样的参数。如
$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方式设置路由,但不会创建全局函数或避免框架。我很想听听你的想法。