目录
1.调整模型类
2,邮箱认证演示
3,源码
从 Laravel 5.7 起,Laravel 自带了邮箱验证的相关字段和功能
首先,调整下User 模型类,实现 MustVerifyEmail
接口
use Illuminate\Auth\MustVerifyEmail as MustVerifyEmailTrait;
use Illuminate\Contracts\Auth\MustVerifyEmail as MustVerifyEmailContract;
class User extends Authenticatable implements MustVerifyEmailContract
{
use Notifiable, MustVerifyEmailTrait;
查看源码:
Illuminate\Auth\MustVerifyEmail 有如下三个方法
#检测用户 Email 是否已认证;
public function hasVerifiedEmail();
#将用户标示为已认证
public function markEmailAsVerified();
#发送 Email 认证的消息通知,触发邮件 的发送
public function sendEmailVerificationNotification();
得益于 PHP 的 trait 功能,User 模型在 use 以后,即可使用以上三个方法
eg:
#可以看到用户是否验证,返回true或false
dd(\Auth::user()->hasVerifiedEmail());
使用laravel中间件来过滤用户的所有请求,如果用户未认证的话,就跳转到邮件认证提醒的页面中
Auth::routes(['verify' => true]);
// 1. 如果用户已经登录
// 2. 并且还未认证 Email
// 3. 并且访问的不是 email 验证相关 URL 或者退出的 URL
public function handle($request, Closure $next)
{
if($request->user() &&
! $request->user()->hasVerifiedEmail() &&
! $request->is('email/*', 'logout')){
// 根据客户端返回对应的内容
return redirect()->route('verification.notice');
}
return $next($request);
}
然后将其注册
在.env中将邮件先发送到 log 中:
MAIL_DRIVER=log
注册后,发现会跳转到验证页面,在log中找到邮件链接,即可激活后跳到主页,此时数据库中email_verified_at字段已不为空
register控制器中
Illuminate\Foundation\Auth\RegistersUsers
public function register(Request $request)
{
// 检验用户提交的数据是否有误
$this->validator($request->all())->validate();
// 创建用户同时触发用户注册成功的事件,并将用户传参
event(new Registered($user = $this->create($request->all())));
// 登录用户
$this->guard()->login($user);
// 调用钩子方法
return $this->registered($request, $user)
?: redirect($this->redirectPath());
}
其中event(new Registered($user = $this->create($request->all())));
这里使用了 Laravel 的事件系统,触发了 Registered 事件
打开 app/Providers/EventServiceProvider.php 文件,此文件的 $listen 属性里 我们可以看到注册了 Registered 事件的监听器
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
];
打开 SendEmailVerificationNotification 类
public function handle(Registered $event)
{
// 如果 user 是继承于 MustVerifyEmail 并且还未激活的话
if ($event->user instanceof MustVerifyEmail && ! $event->user->hasVerifiedEmail())
// 发送邮件认证消息通知(认证邮件) {
$event->user->sendEmailVerificationNotification();
}
}