Laravel6使用事件监听发送消息通知

Posted 酸辣柠檬粉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel6使用事件监听发送消息通知相关的知识,希望对你有一定的参考价值。

用户注册时生成一条欢迎的消息

1.注册事件和监听

在App\\Providers\\EventServiceProvider里面的属性protected $listen中添加要注册的事件名称和监听名称


class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        Registered::class => [
            SendEmailVerificationNotification::class,
        ],
        'App\\Events\\SendNotifyEvent'=>[
            'App\\Listeners\\RegisterNotifyListen',
        ],
    ];

在终端中输入:

 php artisan event:generate

 自动生成App\\Events\\SendNotifyEvent 和 App\\Listeners\\RegisterNotifyListen文件

2.SendNotifyEvent中传入要写入的数据对象


class SendNotifyEvent
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $data;
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($user)
    {
        $this->data = $user;
    }

 __construct()中的$user就是注册的账号的信息,赋值给$data,后面在Listen中使用

3.RegisterNotifyListen中

<?php

namespace App\\Listeners;

use App\\Events\\SendNotify;
use Illuminate\\Contracts\\Queue\\ShouldQueue;
use Illuminate\\Queue\\InteractsWithQueue;
use App\\Notifications\\RegisterNotify as RN;

class RegisterNotifyListen
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  SendNotify  $event
     * @return void
     */
    public function handle(SendNotify $event)
    {
        $data['id'] = $event->data->id;
        $data['name'] = $event->data->name;
        $data['message'] = "欢迎你成为DM一员,在这里你将发现更多有价值的资讯";
        $event->data->notify(new RN($data));
    }
}

 这里$event就可以直接访问$data的数据;

4.引入发送欢迎的消息通知

      4.1 生成消息通知 RegisterNotify

php artisan make:notification RegisterNotify

<?php

namespace App\\Notifications;

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

class RegisterNotify extends Notification
{
    use Queueable;

    private $data;
    /**
     * Create a new notification instance.
     *
     * @return void
     */
    public function __construct($data)
    {
        $this->data=$data;
    }

    /**
     * Get the notification's delivery channels.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function via($notifiable)
    {
        return ['database'];
    }

    /**
     * 数据库的消息
     */
    public function toDatabase($notifiable){
        return $this->data;
    }

 使用数据库做消息通知 via()中return ['database'],添加 function toDatabase($notifiable)

 构造函数中传值data;然后在toDatabase中使用

return $this->data;是将RegisterNotify传入的这段数据$data['id'] = $event->data->id存入了数据库的data字段

4.2  RegisterNotifyListen中引入刚才注册的RegisterNotify

use App\\Notifications\\RegisterNotify as RN;

并在handler中调用notify(实例化的对象)

   $data['id'] = $event->data->id;
   $data['name'] = $event->data->name;
   $data['message'] = "欢迎你成为DM一员,在这里你将发现更多有价值的资讯";
   $event->data->notify(new RN($data));

5.在控制器中调用事件

public function register(Request $request){
        $token = Token::generate();
        $user = new User;
        $user->api_token = Token::hashed($token);
        $user->name = $request->input('username');
        $user->password=password_hash($request->input('password'),PASSWORD_DEFAULT);
        $user->token_expire = Token::expire();
        $user->save();

        //发送注册通知
        event(new SendNotifyEvent($user));

    }

使用全局函数event(new SendNotifyEvent(刚注册的账号对象信息));

如果是发给其他人(非本人,比如id=2),这里的账号对象信息$user应该是$user = User::find(2);

5.1 模型Model中引入Notifiable 

要使User Model有->notify( )属性,需要在 model模型中添加 trait

<?php

namespace App;

use Illuminate\\Notifications\\Notifiable;
use Illuminate\\Foundation\\Auth\\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;//trait Notifiable
}

在控制器中获取未读消息

    public function welcomeNotify(Request $request){
        $user = $request->userInfo;//获取的登陆用户数据 比如user::find(1)

        foreach ($user->unreadNotifications as $notification) {
            var_dump ($notification->toArray());
        }
        
    }

在控制器中将未读变已读

    public function markread(Request $request){
        // $request->id  //传给前端的某条未读信息的id
        $user = User::find(1);
        //这里是标记某条为已读。如果是全部去掉未读,删除where()
        $user->notifications()->where('id',$request->id)->update(['read_at' => now()]);
    }

总结:虽然以上可以直接一条语句在控制器中完成,比如直接在控制器中引入

use App\\Notifications\\RegisterNotify as RN

 然后使用

$user->notify(new RN($user))

但是当有多个事件的时候,代码就耦合的有点多了,这么写会使代码解耦

以上纯属个人编写测试,如有问题,可以留言。

以上是关于Laravel6使用事件监听发送消息通知的主要内容,如果未能解决你的问题,请参考以下文章

Laravel6使用事件监听发送消息通知

Laravel6使用事件监听发送消息通知

Discord bot - 发送多条消息的 Js 事件监听器

Android Smack MessageEventListener

如何在通知选项卡中单击推送通知消息打开特定片段?

[技术博客]react native事件监听与原生通信——实现对通知消息的响应