Laravel进阶系列笔记--(二十七)Laravel 事件监听与通知联合使用发送邮件通知
作者:温新
时间: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队列驱动,第七步也不需要,这样可以直接发送邮件通知了。
我是温新
每天进步一点点,就一点点
请登录后再评论