发送确认链接并单击原始电子邮件后,用新电子邮件更新用户的个人资料
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了发送确认链接并单击原始电子邮件后,用新电子邮件更新用户的个人资料相关的知识,希望对你有一定的参考价值。
[我有一个使用Laravel 6构建的网站。当用户在表单中的“编辑个人资料”部分中更新其电子邮件地址并提交时,我想发送指向其原始电子邮件地址的链接,因此我知道他确实是该帐户的所有者,并且他有权访问该电子邮件地址。在他单击收到的电子邮件中的链接之后,该数据库将使用新电子邮件进行更新,并且“ email_verified_at”变为空,因为他还必须确认新的电子邮件地址。
我已经创建了邮件,当用户提交表单时我可以发送电子邮件,但是对于如何创建链接(可能带有令牌)以及当用户在电子邮件中单击链接时,我一无所知,数据库将使用新的电子邮件地址进行更新。
我需要一些有关如何创建事件/侦听器的建议,以便在用户单击确认链接后提交表单以更新数据库。
我的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>
答案
您需要创建一个唯一的/签名的URL。 docs很好地解释了这一点。此外,您很可能希望创建一个可以在几个小时内暂时访问的链接。
基本方法是这样做:
$url = URL::temporarySignedRoute('register', now()->addDays(2), ['email' => 'user@example.com']);
此SignedRoute将在2天后失效。
现在您需要在邮件中使用此自定义临时链接。
以上是关于发送确认链接并单击原始电子邮件后,用新电子邮件更新用户的个人资料的主要内容,如果未能解决你的问题,请参考以下文章
.Net Core Entity Framework 电子邮件确认“单击此处”链接不更新“EmailConfirmed”数据库属性