Laravel在哪里传递了额外的参数来运作

时间:2016-01-20 09:31:37

标签: php laravel arguments closures

以下显然会导致未定义的变量。

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

   return $article;
}

尝试使用$ slug变量提供函数:

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}()

你怎么能让功能访问$ slug? 现在这可能很简单但我无法找到我需要搜索的内容。

2 个答案:

答案 0 :(得分:51)

您必须使用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) { /* ... */ });

答案 1 :(得分: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