Quiero enviar un sms al teléfono móvil del usuario (si ya había activado el sistema de autenticación de dos factores).

Así que en LoginController agregué este método:

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

Y este método loggendin está dentro de un rasgo llamado TwoFactorAuthentication que es así:

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;
    }
}

Ahora el problema es que cuando quiero iniciar sesión, aparece este mensaje en la pantalla que dice:

Error Llamada a una función miembro notificar () en nulo

Que se refiere a esta línea:

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

Y este ActiveCodeNotification contiene algunas configuraciones para enviar los sms.

Si desea visitar eso, aquí está:

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
        ];
    }
}

Entonces, ¿qué va mal aquí? Recibo una llamada a una función miembro notificar () en nulo mientras sus dos parámetros tienen valor.

Entonces, si lo sabe, hágamelo saber, realmente agradecería cualquier idea de ustedes ...

Gracias.

2
ruwroveajaic 8 dic. 2020 a las 21:25

2 respuestas

La mejor respuesta

Prueba esto:

Primero, asegúrese de que su modelo de usuario tenga el rasgo Notificable.

Parte superior de la clase de modelo de usuario:

use Illuminate\Notifications\Notifiable;

Después de esto:

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

Y entonces...

En lugar de

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

Utilice este

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

O

Antes de llamar a auth () -> logout ();

Úsalo al principio:

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

Luego, puede llamar a auth () -> logout ();

Trabajó para mí recientemente

2
Joshua Etim 8 dic. 2020 a las 18:53

El $request->user() sería null en ese punto en LoginController porque la solicitud no fue autenticada y el usuario aún no está configurado en la instancia de solicitud.

Tienes que usar el argumento $user en su lugar:

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

Nota: asegúrese de que su modelo User tenga el rasgo Illuminate\Notifications\Notifiable para poder usar notify().

0
Hafez Divandari 8 dic. 2020 a las 19:39
65204693