web-dev-qa-db-fra.com

Laravel où a passer des arguments supplémentaires pour fonctionner

Ce qui suit se traduit évidemment par une variable non définie.

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

   return $article;
}

Essayer de fournir la fonction avec la variable $ slug:

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

    return $article;
}

résulte en

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

comment pouvez-vous autoriser la fonction à avoir accès à $ slug? Maintenant, c'est probablement quelque chose de simple, mais je ne trouve pas ce que je dois rechercher.

14
Philwn

Vous devez utiliser use pour transmettre des variables (dans votre cas, $slug) dans la fermeture (c'est ce qu'on appelle variable héritant ):

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

    return $article;
}

Si, à l'avenir, vous souhaitez passer $locale en même temps, séparez-les par des virgules:

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

Vous devez hériter la variable de la portée parent:

public function show($locale, $slug) {

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

    return $article;
}

Les fermetures peuvent également hériter des variables de la portée parent. Ces variables doivent être transmises à la construction du langage d'utilisation.

À partir d'ici: http://php.net/manual/en/functions.anonymous.php

4
Giedrius