2016-01-20 98 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