总结要点:消息通知系统

maogu8个月前Laravel119

消息通知系统

  • 用于向用户发送消息提醒

  • 途径:

    • 数据库

    • 邮件

    • 短信

    • Slack

使用

准备数据库

  • 消息通知系统会在一张数据表中存储所有的通知消息

    • 包含通知类型,描述通知的其他信息

# 创建表
php artisan notifications:table

# 数据库迁移
php artisan migrate

创建通知类

  • Laravel 中,一种通知就是一个类,文件一般放在 app/Notifications 中

  • 可以通过 artisan 命令来创建

php artisan make:notification TopicReplied
  • 在通知类的构造方法中,注入需要的模型

  • 每个通知类都会有 via 方法,用来指明通知的方式

return ['database']; or return ['mail'];

针对不同的通知类型,需要实现不同的方法 toXXX($notifiable)

  • 方法接收 $notifiabel 作为参数

  • 方法返回一个数组,该数组之后会转换成 JSON 数据存放在通知数据表的 data 中

如果 via 数据库进行通知,那么 toXXX 就是 toDatabase
如果 via 邮件进行通知,那么 toXXX 就是 toMail

 public function toDatabase($notifiable)
    { 
        // 存入数据库里的数据 data table
        return [
            'reply_id' => $this->reply->id,
            'reply_content' => $this->reply->content,
            'user_id' => $this->reply->user->id,
            'user_name' => $this->reply->user->name,
            'topic_id' => $topic->id,
            'topic_title' => $topic->title,
        ];
    }


触发通知

  • 调用 User 中的 notify 方法,并新建一个通知实例作为参数传入

  • 也可以通过重写 User 类的 notify 方法来实现更多的操作,但最后需要调用 Notifiable.notify 方法来发送通知

 <?php
use App\Notifications\TopicReplied;

class ReplyObserver
{
    public function created(Reply $reply)
    {
        $reply->topic->reply_count = $reply->topic->replies->count();
        $reply->topic->save();

        // 通知话题作者有新
        $reply->$topic->user->topicNotify(new TopicReplied($reply));
    }
}

修改User模型

public function topicNotify($instance)
{
    // 如果要通知的人是当前用户,就不必通知了!
    if ($this->id == Auth::id()) {
        return;
    }
     // 只有数据库类型通知才需提醒,直接发送 Email 或者其他的都 Pass
        if (method_exists($instance, 'toDatabase')) {
            $this->increment('notification_count');
        }
    $this->notify($instance);
}

//用户查看后自动清零
  public function markAsRead()
    {
        $this->notification_count = 0;
        $this->save();
        $this->unreadNotifications->markAsRead();
    }

修改控制器的 index() 方法,新增清空未读提醒的状态:

public function index()
    {
        // 获取登录用户的所有通知
        $notifications = Auth::user()->notifications()->paginate(20);
        // 标记为已读,未读数量清零
        Auth::user()->markAsRead();
        return view('notifications.index', compact('notifications'));
    }

测试「重新发送邮件」和「消息通知」的功能,成功!


相关文章

签到部分

 public function create(Request $request)     {  &nbs...

Artisan 命令日志以网页的方式显示

        header('X-Accel-Buffering: no'); &nb...

laravel 本地储存文件

$path= Storage::disk('public')->put('file.jpg',$value['ImgUrl']);...

数组表单提交

<form id="form1" action="./index.php" method="get"&g...

Laravel 7使用Http Client同步api数据到数据库-定时任务

测试Api 来自https://api.qq.jsososo.com/ 是个开源项目安装httpcomposer require guzzlehttp/guzzlephp...

更新json数组

Route::get('/', function () {   \App\User::query()->where(&...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。