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队列驱动,第七步也不需要,这样可以直接发送邮件通知了。
我是温新
每天进步一点点,就一点点
请登录后再评论