Laravel进阶系列笔记--(二十五)Laravel 基于Notification邮件通知的快速使用
作者:温新
时间:2021-07-31
hi,我是温新,一-名PHPer。
本系列采用Laravel8.x演示。
之前的文章记录过发送邮件,邮件就是通知的一种。除了邮件外短信也是通知。比如说微信支付,当支付后会有一个支付金额的通知。
消费通知介绍
Laravel支持多种消息通知,如邮件、短信、Slack等。通知还能存储到数据库以便后续在 Web 页面中显示。
应用场景
举例:如用户注册后,发送一封邮件通知用户注册成功,根据 Laravel7使用QQ邮箱发送邮件详解 这篇文章的介绍就可以实现,即用户注册成功后,下一行代码就是发送邮件的代码。如果后期需要使用短信或拿用户信息做些其它功能,那么代码就会变得臃肿,难以维护且不可复用。
而消息通知简化了这些操作,使得代码更加优雅可读。
通知可以有多种方式实现,如Laravel事件监听、消息通知、队列都可以实现,后续将这些功能结合起来做一个学习式温习式记录。
Notification邮件通知
对于邮件通知,我这里使用QQ邮件作为演示。
我这里使用了广播时的数据库,因此用户表中是有数据的,发送邮件基于用户表发送。
第一步:配置服务
// .env
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 // 发送者名称,可自定义
第二步:创建消息通知
php artisan make:notification SendUserRegisterEmail
该命令会在app/Notifications
目录下生成对应的通知类文件。该通知文件中默认有,其中via
为消息构建方法,用于将通过转为特定渠道优化的消息。
第三步:定义路由
// web.php
// 发送邮件
Route::get('send','TestController@send');
// 邮件成功后的跳转页面
Route::get('succ', function(){
return '消息邮件发送成功';
});
第四步:创建控制器与方法
1)控制器
php artisan make:TestController
2)方法
// TestController.php
public function send()
{
}
第三步:编写邮件消息通知类
// Notifications/SendUserRegisterEmail.php
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
class SendUserRegisterEmail extends Notification
{
use Queueable;
// 用户实例信息
public $user = null;
public function __construct($user)
{
$this->user = $user;
}
// 哪种通知
public function via($notifiable)
{
return ['mail'];
}
// 邮件发送的内容
// $notifiable接收的同样是用户实例信息
public function toMail($notifiable)
{
return (new MailMessage)
->line('The introduction to the notification.')
->action('Notification Action', url('/'))
->line('Thank you for using our application!');
}
public function toArray($notifiable)
{
return [];
}
}
第四步:模拟注册用户进行发送邮件
懒,不去创建登录页面了,直接模拟用户注册。
1)方式一:控制器层发送邮件。修改send
方法
<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Notifications\SendUserRegisterEmail;
use Illuminate\Support\Facades\Notification;
public function send()
{
// 模拟用户注册
$user = User::create([
'name' => '赵六',
'email' => '3413648628@qq.com',
'password' => encrypt('123456'),
]);
// 为注册用户发送邮件
Notification::send($user, new SendUserRegisterEmail($user));
}
2)方式二:模型层调用
User
模型中发送邮件
// Models/User.php
// 添加用户并发送邮件
public static function sendMail()
{
// 创建用户
$user = self::create([
'name' => '赵六',
'email' => '3413648628@qq.com',
'password' => encrypt('123456'),
]);
// 发送邮件
$user->notify(new SendUserRegisterEmail($user));
return $user;
}
修改控制器中的send
方法
// TestController.php
<?php
namespace App\Http\Controllers;
use App\Models\User;
public function send()
{
$user = User::sendMail();
}
这两方式可以单独演示。目前使用的是默认的发送信息,定义的发送成功后的跳转路由也没有用到,下面将开始自定义发送邮件的内容。
第五步:访问路由发送邮件
方式:你的域名/send
到这里,邮件发送已经完成。下面的操作为自定义操作。
其他自定义操作
基本信息操作
为了方便起见,我这里修改了控制器中的send
方法,取出一个用户对它进行发送邮件。
// TestController.php
$user = User::find(9);
Notification::send($user, new SendUserRegisterEmail($user));
自定义基本信息
// Notifications/SendUserRegisterEmail.php
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');
}
自定义邮件模板
可以看到,使用自定义的通知时会有默认的模板,若不想用默认的模板则需要自自定义,好在自定义模板很简单。
1)修改控制器方法
// Notifications/SendUserRegisterEmail.php
public function toMail($notifiable)
{
return (new MailMessage)
->subject('注册成功')
// 自定义模板 email
->view('email',['user'=>$this->user]);
}
2)定义邮件通知模板
// resources/views/email.blade.php
<h1>自如初</h1>
<p>欢迎 {{ $user->name }}</p>
<p>这里是自如初学习记录网站</p>
邮件预览
在设计邮件模板时,可以通过预览来确定是否是自己所想要的模板,邮件预览使用toMail
方法。
修改控制器方法
// TestController.php
public function send()
{
$user = User::find(9);
// 访问路由时返回邮件模板
return (new SendUserRegisterEmail($user))->toMail($user->user);
}
还是Markdown语法模板邮件,这里就不记录了。若想快速使用Markdown通知模板,请参考 Laravel进阶系列笔记--(18)Laravel 发送邮件
我是温新
每天进步一点点,就一点点