Laravel进阶系列笔记--(二十七)Laravel 事件监听与通知联合使用发送邮件通知

作者: 温新

分类: 【Laravel】

阅读: 1862

时间: 2021-09-02 11:19:16

作者:温新

时间:2021-08-02

hi,我是温新,一-名PHPer。

本系列采用Laravel8.x演示。

第一步:邮件配置

1).env相关配置

// .env
// 使用redis队列进行通知
QUEUE_CONNECTION=redis
    
MAIL_DRIVER=smtp
MAIL_HOST=smtp.qq.com               // 邮箱服务器
MAIL_PORT=465                       // 端口
MAIL_USERNAME=xyhcx@foxmail.com@qq.com      // 邮件发送者名称(自己)
MAIL_PASSWORD=****************      // 邮件秘钥(开通服务后的秘钥)
MAIL_ENCRYPTION=ssl                 // 加密传输
MAIL_FROM_ADDRESS=xyhcx@foxmail.com@qq.com  // 邮件发送者地址(自己)这个必须与MAIL)USERNAME一致
MAIL_FROM_NAME=ziruchu              // 发送者名称,可自定义

2)windows10中打开redis数据库

第二步:创建通知

1)创建通知

php artisan make:notification UserRegisterNotification

2)编写通知

// Notifications/UserRegisterNotification.php
<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;

// 用户注册后的通知
// 需要实现ShouldQueue接口
class UserRegisterNotification extends Notification implements ShouldQueue
{
    use Queueable;

    public $user = null;

    public function __construct($user)
    {
        $this->user = $user;
    }

    // 邮件通知
    public function via($notifiable)
    {
        return ['mail'];
    }

    // 发送邮件
    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->subject('注册成功')
            ->greeting($this->user->name . '您好: ')
            ->line('您于' . $this->user->created_at->format('Y-m-d H:i:s').'注册为自如初网站用户')
            ->line('自如初一个PHP记录博客')
            ->action('验证', url('succ'))
            ->level('success');
    }

    public function toArray($notifiable)
    {
        return [];
    }
}

第三步:生成事件/监听器

1)绑定事件与监听器的映射关系

// Providers/EventServiceProvider.php
protected $listen = [
    'App\Events\UserRegister' => [
        'App\Listeners\SendUserRegisterEmail',
    ],
];

绑定用户注册UserRegister事件与其对应的监听器SendUserRegisterEmail

2)生成事件与监听器类

php artisan event:generate

第四步:修改事件类与监听器类

1)事件类修改

// Events/UserRegister.php
<?php

namespace App\Events;

use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class UserRegister
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $user;

    public function __construct($user)
    {
        $this->user = $user;
    }

    // 获取用户信息
    public function getUser()
    {
        return $this->user;
    }
}

2)修改监听器类

// Listeners/SendUserRegisterEmail.php

<?php

namespace App\Listeners;

use App\Events\UserRegister;
use App\Notifications\UserRegisterNotification;

class SendUserRegisterEmail
{
    public function __construct(){}

    public function handle(UserRegister $event)
    {
        // 获取用户信息。调用事件类方法
        $user = $event->getUser();

        // 监听器中发送发送
        $user->notify(new UserRegisterNotification($user));
    }
}

第五步:定义路由

// web.php
Route::get('send','TestController@send');

第六步:创建控制及逻辑方法

1)创建控制器

php artisan make:controller TestController

2)编写控制器方法及逻辑

// TestController.php

public function send()
{
    $user = User::find(9);
    event(new UserRegister($user));
}

我这时使用查询用户用于模拟注册用户,并为其发送一个邮件通知。

第七步:执行队列,发送邮件通知

// 命令行中执行
php artisan queue:listen

第八步:访问路由,模拟用户注册

浏览器中输入 你的域名/send进行用户注册并发送邮件通知。

第九步:逻辑解释

1)当访问路由时,用户注册后,触发用户注册事件,

2)对应事件监听就会监听到事件的动作,并进行通知

3)监听器监听时就会发送通知,这个通知就被存储到了redis数据中

4)最后执行任务队列,那么邮件通知就成功发送了

5)第三步中可以不实现ShouldQueue队列驱动,相对第一步中就不需要redis队列驱动,第七步也不需要,这样可以直接发送邮件通知了。

我是温新

每天进步一点点,就一点点

请登录后再评论