Laravel学习笔记(35)利用事件进行邮箱验证功能(notify,listen,event,MailHog)

使用一个事件的处理分为以下几点
(1)注册事件和事件监听器
(2)编写事件监听器内的触发操作

具体可以查看:Laravel事件以及模型事件小结

PS:Observer观察者也是对模型事件进行处理,不过两者略有区别,可以参考Laravel 中的模型事件与 Observer

所以对于‘利用事件进行邮箱验证功能’有以下几点操作:

在这里插入图片描述
前期准备:

	$table->string('mail_token')->default('');
    $table->tinyInteger('mail_status')->default('0');
  1. 使用中间件判断是否已经登陆,登陆的账户是否验证过邮箱
Route::middleware('Mail.check')->get('/', function (\Modules\Admin\Entities\Module $module) {
    return app()->build('\Modules\\'.$module->getDefault().'\Http\Controllers\HomeController')->index();
});
    public function handle($request, Closure $next)
    {
        $user = auth('web')->user();
        if (auth('web')->check() && $user->mail_status == 0) {
            return redirect()->route('check_mail_show');
        }

        return $next($request);
    }

注册中间件

// app/Http/Kernel.php
'Mail.check' => \App\Http\Middleware\MailCheckMiddleware::class,

中间件验证

    public function handle($request, Closure $next)
    {
        $user = auth('web')->user();
        if (auth('web')->check() && $user->mail_status == 0) {
            return redirect()->route('check_mail_show');
        }

        return $next($request);
    }
  1. 在事件的服务提供者中注册邮箱注册事件app/Providers/EventServiceProvider.php(用于发送验证邮箱)

事件对监听器 ,是一对多的关系。想做出多种监听,可以放在一起。

atisan make:listener SendRegisterMailListener
    protected $listen = [
    	// Registered::class就是一个默认的注册事件
    	// Registered因为是ed所以是在注册完成之后执行
        Registered::class => [
        	// SendRegisterMailListener::class事件监听器,负责具体的事件操作
        	// 绑了两个监听器,符合一对多的关系
            SendRegisterMailListener::class,
            SendEmailVerificationNotification::class,
        ],
    ];
  1. 编辑SendRegisterMailListener事件监听器
    public function handle(Registered $event)
    {
        $user = $event->user;
        $email_token = \Str::random(5);
        $user->mail_token = $email_token;
        $user->save();
        // 发送验证邮件
        $user->notify(new EmailNotify($user));
    }

PS:2,3两步其实可以换成Observer,即将发送验证邮件方法放到Observer去执行

  1. 生成Notify模板
atisan make:notification EmailNotify
    public function __construct($user)
    {
        $this->user = $user;
    }

    public function toMail($notifiable)
    {
        return (new MailMessage)
                    ->subject('请验证邮箱')
                    ->line('请验证邮箱')
                    ->action('请验证邮箱', url('/check_mail_token/'.$this->user->mail_token))
                    ->line('Thank you for using our application!');
    }
  1. 因为已经注册并登陆了,但是mail_token为false,所以验证失败根据中间件跳到route('check_mail_show')
  2. 可以使用Laravel自带的MailHog来验证邮箱,配置如下
MAIL_DRIVER=smtp
MAIL_HOST=localhost
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=test@qq.com
MAIL_FROM_NAME="${APP_NAME}"
// 邮件查看:
http://www.mushishi.com:8025            (其中,www.mushishi.com为当前域名)

在这里插入图片描述
7. 点击验证邮箱进行验证

// 邮箱验证相关
Route::view('/check_mail_show', 'auth.check_mail_show')->name('check_mail_show');
Route::get('/send_mail_token', 'MailController@send_mail_token')->name('send_mail_token');
Route::get('/check_mail_token/{token}', 'MailController@check_mail_token')->name('check_mail_token');
    public function send_mail_token() {
        $user = auth('web')->user();
        $user->notify(new EmailNotify($user));
        return back();
    }

    public function check_mail_token($token) {
        $user = User::where('mail_token', $token)->first();
        if ($user) {
            $user->mail_status = true;
            $user->update();
            session()->flash('success', '邮箱验证成功');
            return redirect('/');
        };

        session()->flash('success', '邮箱验证失败');
        return redirect('/');
    }
发布了68 篇原创文章 · 获赞 0 · 访问量 1741

猜你喜欢

转载自blog.csdn.net/qj4865/article/details/104520959