Ошибка PHP с переменной в функции обратного вызова

#php #laravel #scope

#php #laravel #область видимости

Вопрос:

У меня есть эта функция в php (laravel):

     public static function isUserParticipatesInTournament($tourId, $userId)
    {
        var_dump($userId); //dumped
        $user = User::find($userId);

        if(!$user)
        {
            return null;
        }

        $obj = $user->whereHas('tournaments', function($query)
        {
            var_dump($tourId); //error
            $query->where('id', '=', $tourId); //error
        })->get();

        return $obj;
    }
  

Проблема в том, что при закрытии $obj = $user->whereHas('tournaments', function($query){...} $tourId переменная в нем не определена. Я получаю эту ошибку:
Undefined variable: userId .

Почему это происходит? Переменная объявлена в области видимости внутренней функции. Моя единственная мысль заключается в том, что это функция обратного вызова.

Когда я попытался выполнить эту функцию: $obj = $user->whereHas('tournaments', function($query, $tourId){...} тогда я получаю это исключение:

 Missing argument 2 for User::{closure}()
  

Ответ №1:

Ваша $tourId переменная не входит в область действия вашей анонимной функции. Взгляните на use ключевое слово, чтобы увидеть, как вы можете добавить его в область видимости. Смотрите пример 3 на этой странице: http://www.php.net//manual/en/functions .anonymous.php

Это должно выглядеть примерно так:

 $obj = $user->whereHas('tournaments', function($query) use($tourId)
    {
        var_dump($tourId); // Dumps OK
    })->get();