簡體   English   中英

Laravel路徑URL查詢字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM