#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()
.