如何用Laravel推送器按ID从管理员发送通知给用户

ljsrvy3e  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(108)

我已经成功地在我的laravel应用程序上实现了推送器,但我想使,当用户成功地使订单的默认status_message为pending,情况是当管理员将status_message更改为processed时,已订购的用户会收到一个通知,说明他所做的订单已处理。
这是我的代码,但此代码会向所有用户发送通知。

    • 主计长**
if ($data->status_message == 'processed') {
   event(new OrderEvent('Hi, Your order is processed!'));

   //...
}
    • 我的活动订单活动. php**
public function broadcastOn()
{
    return new Channel('notif-channel');
}

/**
 * Broadcast order event.
 * 
 * @return void
 */
public function broadcastAs()
{
    return 'order-event';
}
    • 在应用程序刀片中**
var channel = pusher.subscribe('notif-channel');
    channel.bind('order-event', function(data) {

        const obj = JSON.parse(JSON.stringify(data));
        const message = obj.message;
        
        blah blah blah
}
lg40wkob

lg40wkob1#

用户和管理员应该在同一个通道上。例如,如果用户订阅了通道"order-channel-SetUserID",管理员应该将消息发送到该通道,您应该在前端查找它,并在DOM上进行更改。
在控制器中,当您提交订单状态的更改时,运行带有通道名称的事件

event(new OrderEvent($user_id, 'Hi, Your order is processed!'));

现在,您的事件应类似于下图:

class OrderEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $user_id;
    public $message;

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

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new Channel('order-channel.' . $this->user_id);
    }

    public function broadcastAs()
    {
        return 'order-event';
    }
}

当然你可以改变你的类名称等...我只是给一个想法。
这是很重要的发送更改在同一频道与此用户,否则你会作出更改,以其他用户正在访问您的网站.

    • 已编辑**

下面是您需要配置的其他内容。在app/Providers/EventServiceProvider.php中
您需要将事件放在protected $listen中

protected $listen = [
        Registered::class => [
            SendEmailVerificationNotification::class,
        ],
        OrderEvent::class => [
            OrderEventListener::class,
        ],
    ];

在app/Listeners中你应该创建OrderEventListener.php并按如下方式设置它:

<?php
    
namespace App\Listeners;
use App\Events\OrderEvent;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Pusher;
    
    class OrderEventListener
        {
            /**
             * Create the event listener.
             *
             * @return void
             */
            public function __construct()
            {
                //
            }
        
            /**
             * Handle the event.
             *
             * @param  \App\Events\OrderEvent  $event
             * @return void
             */
            public function handle(OrderEvent $event)
            {
                $pusher = new Pusher(env('PUSHER_APP_KEY'), 
                          env('PUSHER_APP_SECRET'), env('PUSHER_APP_ID'), [
                    'cluster' => env('PUSHER_APP_CLUSTER'),
                    'useTLS' => true
                ]);
        
                $pusher->trigger($event->broadcastOn(),
                $event->broadcastAs(), $event->data);
            }

}
检查你的调试控制台在pusher Jmeter 板?2如果你能看到事件触发那里所有你需要做的是显示消息与javascript。3如果没有事件正在运行,那么在你的代码中的东西丢失。

相关问题