2016-01-20 26 views
5

以下顯然會導致未定義的變量。Laravel在函數中傳遞了附加參數

public function show($locale, $slug) 
{ 
$article = Article::whereHas('translations', function ($query) { 
$query->where('locale', 'en') 
    ->where('slug', $slug); 
})->first(); 

    return $article; 
} 

試圖提供與$塞變量的函數:

public function show($locale, $slug) 
{ 
    $article = Article::whereHas('translations', function ($query, $slug) { 
     $query->where('locale', 'en') 
     ->where('slug', $slug); 
    })->first(); 

    return $article; 
} 

結果

Missing argument 2 for App\Http\Controllers\ArticlesController::App\Http\Controllers\{closure}() 

你怎麼能允許funtion有機會獲得$塞? 現在這可能是簡單的,但我無法找到我需要搜索。

回答

27

你必須使用use傳遞變量(在你的情況,$slug)進入封閉(這就是所謂的variable inheriting):

public function show($locale, $slug) 
{ 
     $article = Article::whereHas('translations', function ($query) use ($slug) { 
     $query->where('locale', 'en') //        ^^^ HERE 
       ->where('slug', $slug); 
    })->first(); 

    return $article; 
} 

如果,在未來,要在沿有傳$locale它只是逗號分開吧:

Article::whereHas('translations', function ($query) use ($slug, $locale) { /* ... */ }); 
+0

我知道這將是一些簡單。謝謝 – Philwn

+0

沒問題,夥計。快樂的編碼! :-) – Dencker

2

你需要從母體繼承範圍變量:

public function show($locale, $slug) { 

    $article = Article::whereHas('translations', function ($query, $slug) use ($slug){ 
     $query->where('locale', 'en') 
     ->where('slug', $slug); 
    })->first(); 

    return $article; 
} 

閉包也可能繼承父範圍的變量。任何這樣的變量都必須傳遞給使用語言結構。

從這裏:http://php.net/manual/en/functions.anonymous.php