Вызов функции-члена notify() при null в Laravel 8

#php #laravel #laravel-8

#php #laravel #laravel-8

Вопрос:

Я хочу отправить SMS на мобильный телефон (если он уже включил систему двухфакторной аутентификации).

Итак, LoginController я добавил этот метод:

 protected function authenticated(Request $request, $user)
{
    return $this->loggendin($request , $user);
}
 

И этот loggendin метод находится внутри вызываемого признака TwoFactorAuthentication , который выглядит следующим образом:

 trait TwoFactorAuthenticate
{
    public function loggendin(Request $request , $user)
    {
        if($user->hasTwoFactorAuthenticatedEnabled()) {
            auth()->logout();

            $request->session()->flash('auth' , [
                'user_id' => $user->id,
                'using_sms' => false,
                'remember' => $request->has('remember')
            ]);


            if($user->two_factor_type == 'sms') {
                $code = ActiveCode::generateCode($user);
                // Todo Send Sms
                $request->user()->notify(new ActiveCodeNotification($code , $user->phone_number));

                $request->session()->push('auth.using_sms' , true);
            }

            return redirect(route('twofa.token'));
        }

        return false;
    }
}
 

Теперь проблема в том, что когда я хочу войти в систему, на экране появляется это сообщение, в котором говорится:

Ошибка вызова функции-члена notify() при null

Который ссылается на эту строку:

 $request->user()->notify(new ActiveCodeNotification($code , $user->phone_number));
 

И это ActiveCodeNotification содержит некоторые настройки для отправки SMS.

Если вы хотите посетить это, вот оно:

 class ActiveCodeNotification extends Notification
{
    use Queueable;

    public $code;

    public $phoneNumber;
    /**
     * Create a new notification instance.
     *
     * @return void
     */
    public function __construct($code , $phoneNumber)
    {
        $this->code = $code;
        $this->phoneNumber = $phoneNumber;
    }

    /**
     * Get the notification's delivery channels.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function via($notifiable)
    {
        return [GhasedakChannel::class];
    }


    public function toGhasedakSms($notifiable)
    {
        return [
            'text' => "{$this->code}",
            'number' => $this->phoneNumber
        ];
    }
}
 

Итак, что здесь не так, что я получаю вызов функции-члена notify() при null, в то время как два параметра имеют значение.

Так что, если вы знаете, пожалуйста, дайте мне знать. Я был бы очень признателен за любую идею от вас, ребята…

Спасибо.

Ответ №1:

Попробуйте это:

Во-первых, убедитесь, что ваша пользовательская модель имеет признак Notifiable.

Начало класса модели пользователя:

 use IlluminateNotificationsNotifiable;
 

После этого:

 class User extends Model{
use Notifiable; // ....
 

И затем…

Вместо

 $request->user()->notify(new ActiveCodeNotification($code , $user->phone_number));
 

Используйте это

 $user->notify(new ActiveCodeNotification($code, $user->phone_number));
 

Или

Перед вызовом auth()-> logout();

используйте его сначала:

 auth()->user()->notify(new ActiveCodeNotification($code, $user->phone_number));
 

затем вы можете вызвать auth()-> logout();

Работал у меня недавно

Ответ №2:

$request->user() В null этот момент будет включено LoginController , потому что запрос не был аутентифицирован, и пользователь еще не установлен в экземпляре запроса.

Вместо этого вы должны использовать $user аргумент:

 $user->notify(new ActiveCodeNotification($code , $user->phone_number));
 

Примечание: убедитесь, что ваша User модель имеет IlluminateNotificationsNotifiable свойство, чтобы иметь возможность использовать notify() .