Laravel——Web 实战第三章注册登录(2)(学习笔记)

注:此处所用的注册等系列功能,均作用于laravel自带的用户认证机制

注册验证码

  1. composer安装验证码
        composer require  "mews/captcha:~3.0"

    2.运行以下命令生成配置文件 config/captcha.php

        php artisan vendor:publish --provider='Mews.aptcha.aptchaServiceProvider'  

    3.前端展示验证码

        <img class="thumbnail captcha mt-3 mb-2" src="{{ captcha_src('flat') }}" onclick="this.src='/captcha/flat?'+Math.random()" title="点击图片重新获取验证码">

    4.后端验证(该扩展包是为Laravel定制的扩展包,完全兼容laravel注册功能,验证非常方便)只需要在app/Http/Controllers/Auth/RegisterController.php中的验证规则中加入如下代码:

        'captcha'  =>  ['required',  'captcha'],

    邮箱认证

  2. laravel自带邮箱认证
    laravel自带的邮箱认证文件位于 vendor/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.php ,因为此文件采用trait声明,因此我们快速的将内容通过use集成到用户的模型中,并进行调用,如下:
        namespace App\Models;
        use Illuminate\Foundation\Auth\User as Authenticatable;
        use Illuminate\Notifications\Notifiable;
        use Illuminate\Auth\MustVerifyEmail as MustVerifyEmailTrait;
        class User extends Authenticatable {
           use Notifiable, MustVerifyEmailTrait;

    为了代码的规范,我们可以接入larave自带的邮箱验证接口 Illuminate\Contracts\Auth\MustVerifyEmail,规定模型必须拥有相关的方法,具体方法如下(方法在MustVerifyEmailTrait中已经定义好,直接调用既可):

    • hasVerifiedEmail() 检测用户 Email 是否已认证;
    • markEmailAsVerified() 将用户标示为已认证;
    • sendEmailVerificationNotification() 发送 Email 认证的消息通知,触发邮件的发送;
    • getEmailForVerification() 获取发送邮件地址,提供这个接口允许你自定义邮箱字段。
  3. 发送邮件
    我们使用了 Laravel 自带的 RegisterController ,控制器通过加载 Illuminate.oundation.uth.egistersUsers trait 来引入框架的注册功能,此时我们打开此 trait 来翻阅源码并定位到 register(Request $request) 方法:

    public  function  register(Request $request)  {  
    // 检验用户提交的数据是否有误  
    $this->validator($request->all())->validate();  
    // 创建用户同时触发用户注册成功的事件,并将用户传参  
    event(new  Registered($user  =  $this->create($request->all())));  
    // 登录用户  
    $this->guard()->login($user);  
    // 调用钩子方法`registered()`
    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 类,阅读其源码:vendor/laravel/framework/src/Illuminate/Auth/Listeners/SendEmailVerificationNotification.php

<?php  
namespace Illuminate\Auth\Listeners;

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

class SendEmailVerificationNotification
{
    /**
     * 处理事件
     *
     * @param  \Illuminate\Auth\Events\Registered  $event
     * @return void
     */
    public function handle(Registered $event)
    {
        // 如果 user 是继承于 MustVerifyEmail 并且还未激活的话
        if ($event->user instanceof MustVerifyEmail && ! $event->user->hasVerifiedEmail()) {
            // 发送邮件认证消息通知(认证邮件)
            $event->user->sendEmailVerificationNotification();
        }
    }
}

可以看出 Laravel 默认已经为我们设置了邮件发送的逻辑,接下来我们来测试一下。

3.测试邮件

测试之前,我们先设置下邮件发送到 log 中,以便后面的测试:
修改环境设置文件.env

MAIL_DRIVER=log

邮件一般发在storage/logs目录下的日志文件中

本作品采用《CC 协议》,转载必须注明作者和本文链接
附言 1  ·  4年前

前端展示验证码代码:

{{ captcha_src('flat') }}

附言 2  ·  4年前

{{ captcha_src('flat') }}

gongmeng
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1
lochpure

排版乱了,建议重新排下版

4年前 评论
gongmeng (楼主) 4年前

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