[英]Laravel route url with query string
在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
我做了一些研究和所有laravel方法生成的URL使用這樣的參數。 我怎樣才能生成查詢字符串的URL?
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'
基本上,數組中包含字符串鍵的任何元素都將被視為查詢參數( /products?param=value
)。 任何帶有整數鍵的內容都將被視為 URL 參數 ( /products/{arg}
)。
這在操作方法中也受支持:
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']);
2019 - 編輯:
如果您不能使用route()
或action()
,您可以使用Arr::query()
助手生成帶有查詢參數的 URL:
url('/products?').\Illuminate\Support\Arr::query(['manufacturer' => 'Samsung']);
// Returns 'http://localhost/products?manufacturer=Samsung'
或者:
url('/products?').http_build_query(['manufacturer' => 'Samsung'], null, '&', PHP_QUERY_RFC3986);
// 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);
}
然后調用它:
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鮑曼的想法(他的回答)是一個很少需要查詢字符串的URL,並認為Laravel至少應該考慮增加查詢字符串的功能(回)。有很多情況下,當你想查詢字符串的URL,而不是設置了一個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
...較長,“丑陋”,它實際上是在這個不那么罕見的情況要好。 網:友好的URL是偉大的一些東西,查詢字符串是偉大的人。
答案原來的問題...
我需要的“查詢字符串”版本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加載其之前的版本。)
干杯,
克里斯
以下是我需要做的:
我在服務提供者中處理我的所有路由,在那里我定義了以下函數:
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 自動完成一起使用,它是修改控制器的條件來檢查 $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()
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.