Вызов Laravel функции-члена при нулевом значении

Я потратил последний час на гугление и чтение сообщений стека по этой проблеме, но не смог решить эту проблему. Я прикрепил try catch и оператор if, и я все еще получаю call to member function on null error. Вот мой код

 try{
            $user = Auth::user();
            if(null !== ($user->wasStripePlan())){
                $data['allSubscriptions'] = (Auth::user()->wasStripePlan()) ? Auth::user()->subscriptions : [];
            }
        }catch (\PDOException $e){
            $data['allSubscriptions'] = false;
        }

Есть идеи по решениям?


person Aaron    schedule 18.01.2019    source источник
comment
Я думал, что PDOExceptions выбрасываются, когда что-то идет не так с вызовом базы данных. Вы пытались просто поймать \Exception (родительский класс)? Я думаю, что вы не получаете PDOException, поэтому он продолжает двигаться через блок try.   -  person N Mahurin    schedule 18.01.2019


Ответы (2)


Я думаю, что вы слишком много думали об этом. Нет необходимости делать попытку/поймать, когда простые операторы if/else могут справиться с этим.

if(isset(Auth::user()){
    $data['allSubscriptions'] = $data['allSubscriptions'] = (Auth::user()->wasStripePlan()) ? Auth::user()->subscriptions : [];
}else{
    $data['allSbuscriptions'] = false;
}

Поскольку вы проверяете, вошел ли пользователь в систему с помощью isset, ошибка не будет выдана, и вам не нужно пытаться ее поймать. Кроме того, если вы не знаете, какая ошибка будет выдана, я бы просто использовал базовый класс Exception в вашем блоке catch. Поскольку он не разрешит улов, если тип исключения не соответствует. Поскольку все типы наследуются от Exception, вы поймаете первый попавшийся.

person N Mahurin    schedule 18.01.2019

Я думаю, вы пытаетесь получить доступ к Auth::user() без входа в систему. Он вернет null, если вы не вошли в систему, и нет необходимости использовать блок try and catch.

Ошибка говорит сама за себя.

Вызов функции-члена для null

если вы заглянете внутрь вызова функции-члена блока try, он находится в условии if после Auth::user(), который может возвращать значение null по нескольким причинам, например, если вы не вошли в систему.

if(null !== ($user->wasStripePlan()))

Согласно ошибке переменная $user равна нулю. Попробуйте выяснить, почему Auth::user() возвращает значение null.

person Rafay Hassan    schedule 18.01.2019