Laravel注册实现邮箱验证

目录

1.调整模型类

2,邮箱认证演示

3,源码


从 Laravel 5.7 起,Laravel 自带了邮箱验证的相关字段和功能

 

1.调整模型类

首先,调整下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()); 

2,邮箱认证演示

使用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字段已不为空

 

3,源码

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

 

你可能感兴趣的:(laravel)