[扩展推荐] Laravel-user-verification 为你的应用添加验证用户邮箱逻辑

说明

我们在开发项目时,通常要发一封验证邮件给用户,用以证明用户输入的邮箱是真实有效的。laravel-user-verification 就提供了这个逻辑。

完整的高质量扩展包推荐列表,请前往:下载量最高 100 个 Laravel 扩展包推荐

1. 安装

1). 使用 composer 安装:

composer require jrean/laravel-user-verification

2). 修改 config/app 文件,在 providers 数组内追加如下内容

'providers' => [
    ...
    Jrean\UserVerification\UserVerificationServiceProvider::class,
],

3). 修改 config/app 文件,在 aliases 数组内追加如下内容

'aliases' => [
    ...
    'UserVerification' => Jrean\UserVerification\Facades\UserVerification::class,
],

4). 给用户表添加字段

# 运行以下命令,生成 Migration 文件
php artisan make:migration add_verification_to_users_table --table="users"

# 指定 Migration
php artisan migrate

运行完后,会给用户表添加两个字段:

  • verified: 用于表示用户是否已经验证过邮箱,1 表示已验证,0 表示未验证;
  • verification_token: 发送给用户的 token。

至此,配置完毕。

2. 关键方法介绍

generate

UserVerification::generate(AuthenticatableContract $user)

调用此方法会生成验证 token,并将对应用户的验证状态设置为 未验证

send

UserVerification::send(AuthenticatableContract $user, $subject = null)

调用此方法,将会给用户发送验证邮件,邮件模板如何设置将在下文介绍。

3. Trait 介绍

Jrean\UserVerification\Traits\VerifiesUsers

此 Trait 含有两个关键方法:

  • getVerification(Request $request, $token) 此方法用于处理验证逻辑,验证 token 是否正确。
  • getVerificationError() 此方法用于展示验证失败后的错误提示。

我们可以把验证的路由地址指向 getVerification 方法(下文例子将会介绍到),让其自动验证。

4. 自定义属性介绍

此 package 提供的自定义属性可以很方便的处理我们的验证邮箱业务逻辑,其属性列表如下:

  • $redirectIfVerified = '/'; 如果用户已经验证过,需要跳转到哪个路由
  • $redirectAfterTokenGeneration = '/'; token 生成成功以后,要跳转到哪个路由
  • $redirectAfterVerification = '/'; token 验证成功以后,要跳转到哪个路由
  • $redirectIfVerificationFails = '/verification/error'; token 验证失败以后,要跳转到哪个路由

我们的 Controller 在使用了 VerifiesUsers Trait 的情况下,可以设置这几个属性,让其自动处理这些逻辑。

5. 范例

现在,我们来模拟整套流程的操作:

  1. 用户注册后会给其发验证邮件;
  2. 用户点击验证邮件里的链接地址能跳回本站指定的 url,进行验证。

1). 定义好邮件内容模板

在你的项目里,新建一个模板文件 resources/views/emails/user-verification.blade.php,这个文件将作为邮件正文发送给用户。此模板文件会将当前用户信息赋值到 $user 中。因此我们的模板文件可以这样写:

点击此链接激活您的账户: <a href="{{ $link = url('verification', $user->verification_token) . '?email=' . urlencode($user->email) }}"> {{ $link }}</a>

我们这里设置了一个 verification 的 route,为了让下面的例子可以正常运行,我们需要添加以下 route:

Route::get('verification/{token}', 'Auth\AuthController@getVerification');

注:我们将此路由定义到了 AuthControllergetVerification 方法,此方法是 VerifiesUsers Trait 里的方法,他会自动处理验证逻辑。

2). 定义好错误页面模板

在你的项目里,新建一个模板文件 resources/views/errors/user-verification.blade.php,这个文件将作为验证失败的错误提示页面。

3). 加载 VerifiesUsers Trait

在这里以 AuthController.php 文件为例,我们重写其注册逻辑,让用户注册完以后能自动发送一封验证邮件,并提供验证 Token 功能。

...

    use Jrean\UserVerification\Traits\VerifiesUsers;
    use Jrean\UserVerification\Facades\UserVerification;

    ...

    use VerifiesUsers;

    // 验证失败后的跳转地址
    public $redirectIfVerificationFails = '/emails/verification-result/failure';
    // 检测到用户已经验证过后的跳转地址
    public $redirectIfVerified = '/emails/verification-result/success';
    // 验证成功后的跳转地址
    public $redirectAfterVerification = '/emails/verification-result/success';

    ...

    /**
     * Handle a registration request for the application.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function postRegister(Request $request)
    {
        $validator = $this->validator($request->all());

        if ($validator->fails()) {
            $this->throwValidationException(
                $request, $validator
            );
        }

        $user = $this->create($request->all());

        // 生成用户的验证 token,并将用户的 verified 设置为 0 
        UserVerification::generate($user);

        // 给用户发邮件,邮件内容就是上文提到的 resources/views/emails/user-verification.blade.php 模板里的内容
        UserVerification::send($user, '请验证您的邮箱');

        return redirect($this->redirectPath());
    }

本项目由 The EST Group 成员 @monkey 整理发布,首发地为 Laravel China 社区,转载必须贴上原文链接 教程:【扩展推荐】Laravel-user-verification 为你的应用添加验证用户邮箱...

全文完。

本帖已被设为精华帖!
本帖由系统于 6年前 自动加精
monkey
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 7

验证邮箱这个好,经常用到

7年前 评论

Laravel Auth 居然没有集成验证邮箱这块

7年前 评论
泽辉呀

表示这个不错~

7年前 评论

我是按照上面配置模板和路由,Route::get('verification/{token}', 'Auth\AuthController@getVerification');
但是,发送给用户的邮件里,激活地址是http://www.domain.com/email-verification/check/b6f7e09a0107693ecbf72afd08429e42dc1cd7740c64143b91551fbadca8640f?email=11597465%40qq.com
这是为什么?是需要再设置什么吗?
另外我把路由改成Route::get('/email-verification/check/{token}', 'Auth\RegisterController@getVerification');显示路由不存在??

6年前 评论

@璇子Elaine 解决了,php artisan vendor:publish --provider="Jrean\UserVerification\UserVerificationServiceProvider"将文件copy到我们常用的文件位置,然后可以进行自定义,主要参考文档https://packagist.org/packages/jrean/laravel-user-verification

6年前 评论

如果能自定义字段名就好了,并支持多字段,比如 email_verified, idcard_verified 。因为用到这个验证的地方还是比较多的。

5年前 评论

不太详细,没成功。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!