前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Laravel 邮箱认证

Laravel 邮箱认证

作者头像
切图仔
发布2022-09-14 14:51:33
7650
发布2022-09-14 14:51:33
举报
文章被收录于专栏:生如夏花绚烂

1.首先在UserModel引入邮箱认证相关功能

代码语言:javascript
复制
<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail as MustVerifyEmailContract;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Auth\MustVerifyEmail as MustVerifyEmailTrait;

class User extends Authenticatable implements MustVerifyEmailContract
{
    use Notifiable, MustVerifyEmailTrait;

    protected $fillable = [
        'name', 'email', 'password',
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];

    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

我们修改的User实现了 MustVerifyEmailContract 接口 查看其源码 vendor/laravel/framework/src/illuminate/Contracts/Auth/MustVerifyEmail

代码语言:javascript
复制
<?php

namespace Illuminate\Contracts\Auth;

interface MustVerifyEmail
{
    /**
     * Determine if the user has verified their email address.
     *验证用户邮箱是否认证
     * @return bool
     */
    public function hasVerifiedEmail();

    /**
     * Mark the given user's email as verified.
     *将用户标记为已认证
     * @return bool
     */
    public function markEmailAsVerified();

    /**
     * Send the email verification notification.
     *发送邮件认证的消息通知
     * @return void
     */
    public function sendEmailVerificationNotification();

    /**
     * Get the email address that should be used for verification.
     *获取发送邮件地址
     * @return string
     */
    public function getEmailForVerification();
}

在User内部我们添加了 trait MustVerifyEmailTrait 该trait实现 MustVerifyEmailContract接口

查看其源码 vendor/laravel/framework/src/illuminate/Auth/MustVerifyEmail.php

代码语言:javascript
复制
<?php

namespace Illuminate\Auth;

use Illuminate\Auth\Notifications\VerifyEmail;

trait MustVerifyEmail
{
    /**
     * Determine if the user has verified their email address.
     *检查用户邮箱是否认证
     * @return bool
     */
    public function hasVerifiedEmail()
    {
        return ! is_null($this->email_verified_at);
    }

    /**
     * Mark the given user's email as verified.
     *将用户标记为已认证
     * @return bool
     */
    public function markEmailAsVerified()
    {
        return $this->forceFill([
            'email_verified_at' => $this->freshTimestamp(),
        ])->save();
    }

    /**
     * Send the email verification notification.
     *发送email认证的消息通知
     * @return void
     */
    public function sendEmailVerificationNotification()
    {
        $this->notify(new VerifyEmail);
    }

    /**
     * Get the email address that should be used for verification.
     *获取发送邮件地址
     * @return string
     */
    public function getEmailForVerification()
    {
        return $this->email;
    }
}

我们要实现的功能是用户注册后发送认证邮件,我们查看laravel自带的 RegisterController控制器 app\Http\Controllers\Auth/RegisterController

查看其源码发现加载了 RegistersUsers;

再次找到 RegisterUsers;

vendor/laravel/framework/src/illuminate/Foundation/Auth/RegistersUsers.php

我们主要看 register方法

代码语言:javascript
复制
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这里很关键,这里手动触发了 Registered 事件并传入了用户 我们可以在 app/Providers/EventServiceProvider.php 看到注册的事件监听器

代码语言:javascript
复制
protected $listen = [
        Registered::class => [
            SendEmailVerificationNotification::class,
        ],
    ];

该监听器的逻辑就是SendEmail.....类 我们在次找到 SendEmailVerificationNotification类的源码

vendor/laravel/framework/src/Illuminate/Auth/Listeners/SendEmailVerificationNotification.php

里面就一个handle方法

代码语言:javascript
复制
<?php

namespace Illuminate\Auth\Listeners;

use Illuminate\Auth\Events\Registered;
use Illuminate\Contracts\Auth\MustVerifyEmail;

class SendEmailVerificationNotification
{
    /**
     * Handle the event.
     *
     * @param  \Illuminate\Auth\Events\Registered  $event
     * @return void
     */
    public function handle(Registered $event)
    {
        if ($event->user instanceof MustVerifyEmail && ! $event->user->hasVerifiedEmail()) {
            $event->user->sendEmailVerificationNotification();
        }
    }
}

该方法 判断user是否继承自 MustVerifyEmail 并且用户邮箱没有认证 如果两个条件都满足则调用发送邮件方法。

源码翻了个遍,相信你应该理解其原理了,接下来我们测试邮件发送功能

在.env 中我们将 MATL_DRIVER=smtp 修改为 log这样邮件会保存到 laravel.log文件中

使用其自带的用户注册逻辑与视图 通过命令 php artisan ui:auth 执行迁移文件 php artisan migrate

访问路由 {项目域名}/register

填写相关信息点击注册

在这里插入图片描述
在这里插入图片描述

在laravel.log中发现邮箱认证邮件

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-06-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档