Обновите профиль пользователя новым электронным письмом после того, как ссылка для подтверждения будет отправлена ​​и нажата на исходное электронное письмо. - PullRequest
0 голосов
/ 27 января 2020

У меня есть веб-сайт, созданный с Laravel 6. Когда пользователь обновляет свой адрес электронной почты в разделе редактирования профиля и отправляет его, я хочу отправить ссылку на свой оригинальный адрес электронной почты, чтобы я знал он действительно является владельцем этой учетной записи и имеет доступ к этому адресу электронной почты. После того, как он щелкнет ссылку в полученном электронном письме, база данных будет обновлена ​​новым электронным письмом, и «email_verified_at» станет недействительным, поскольку он также должен подтвердить новый адрес электронной почты.

I Создав письмо, я могу отправить электронное письмо, когда пользователь отправляет форму, но я не знаю, как создать ссылку, может быть, с помощью токена, и когда пользователь щелкает ее в своем электронном письме, база данных получает обновлен с новым адресом электронной почты.

Мне нужны некоторые предложения о том, как я могу создавать события / прослушиватели, чтобы отправлять форму для обновления базы данных после того, как пользователь щелкнет ссылку подтверждения.

Функция обновления My ProfileController:

public function update(ProfileRequest $request)
{
    $data = request();

    // when the user submits the form the e-mail is sent.
    Mail::to(auth()->user()->email)->send(new ChangeProfileEmail($data));


    // line of code to execute after user clicks on link on mail
    auth()->user()->update(['name' => $request->get('name'), 'email' => $request->get('email')]);

    return back()->withStatus(__('An e-mail was sent to your old e-mail address to confirm these changes.'));
}

Шаблон электронной почты, в который я должен добавить ссылку.

@component('mail::message')
<h3>Hello, {{ auth()->user()->name }}</h3>
<p>If you want to change your email from {{ auth()->user()->email }} to {{ $data['email'] }}, please press the Change e-mail button</p>

@component('mail::button', ['url' => ''])
    Change e-mail
@endcomponent
@endcomponent

И мою форму на странице редактирования профиля

<form method="post" action="{{ route('profile.update') }}" autocomplete="off" enctype="multipart/form-data">

    @csrf
    @method('put')
    <h6 class="heading-small text-muted mb-4">{{ __('User information') }}</h6>

    @include('alerts.success')
    @include('alerts.error_self_update', ['key' => 'not_allow_profile'])

    <div class="pl-lg-4">
        <div class="form-group{{ $errors->has('name') ? ' has-danger' : '' }}">
            <label class="form-control-label" for="input-name">{{ __('Name') }}</label>
            <input type="text" name="name" id="input-name" class="form-control{{ $errors->has('name') ? ' is-invalid' : '' }}" placeholder="{{ __('Name') }}" value="{{ old('name', auth()->user()->name) }}" required autofocus>

            @include('alerts.feedback', ['field' => 'name'])
        </div>
        <div class="form-group{{ $errors->has('email') ? ' has-danger' : '' }}">
            <label class="form-control-label" for="input-email">{{ __('Email') }}</label>
            <input type="email" name="email" id="input-email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" placeholder="{{ __('Email') }}" value="{{ old('email', auth()->user()->email) }}" required>

            @include('alerts.feedback', ['field' => 'email'])
        </div>
        <div class="text-center">
            <button type="submit" class="btn btn-success mt-4">{{ __('Save') }}</button>
        </div>
    </div>
</form>

1 Ответ

0 голосов
/ 27 января 2020

Вам необходимо создать уникальный / подписанный URL. документы объясняют это очень хорошо. Кроме того, вы, скорее всего, захотите создать ссылку, которая будет временно доступна на пару часов.

Основной подход c заключается в следующем:

$url = URL::temporarySignedRoute('register', now()->addDays(2), ['email' => 'user@example.com']);

Этот SignedRoute Срок действия истекает через 2 дня.

Теперь вам нужно использовать эту временную ссылку в вашей почте.

Например, вот так в вашем классе Mail.

public function toMail($notifiable)
{
    $url = URL::temporarySignedRoute('register', now()->addDays(2), [
        'email' => 'user@example.com', 
        'user' => $this->user->id
    ]);

    return (new MailMessage)
                ->subject('Activate your email address')
                ->line('In order to use the application, please verify your email address.')
                ->action('Activate your account', $url)
                ->line('Thank you for using our application!');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...