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使用事件监听发送消息通知的主要内容,如果未能解决你的问题,请参考以下文章
Discord bot - 发送多条消息的 Js 事件监听器