php 在广播laravel通知时应该使用什么事件名称

vbopmzt1  于 2023-06-20  发布在  PHP
关注(0)|答案(3)|浏览(109)

我想做实时的laravel通知。
为此,我完成了文档中描述的所有配置。
我的通知类是:

class NewChangeRegisterStatusNotif extends Notification
{
    use Queueable;

    public function __construct ($status_id, $course_id)
    {
        $this->status = CourseUserStatus::findOrFail($status_id);
        $this->course = Course::findOrFail($course_id)->first(['title']);
    }

    public function via ($notifiable)
    {
        return ['database', 'broadcast'];
    }

    public function toMail ($notifiable)
    {
        return (new MailMessage)
            ->line('The introduction to the notification.')
            ->action('Notification Action', 'https://laravel.com')
            ->line('Thank you for using our application!');
    }

    public function toArray ($notifiable)
    {
        return [
            'message' =>
                'Some Messages'
            ,
            'action'  => '#'
        ];
    }
}

下面的代码,创建一个新的通知:

$user = User::findOrFail($user_id);
$user->notify(new NewChangeRegisterStatusNotif($value, $course_id));

这是用于绑定和接收推送器事件的javascript客户端代码:

<script src="{{asset('link/to/pusher.min.js')}}"></script>
        <script>
            Pusher.log  = function (msg) {
                console.log(msg);
            };
            var pusher  = new Pusher("{{env("PUSHER_KEY")}}");
            var channel = pusher.subscribe('App.User.1');
                 channel.bind('Illuminate\Notifications\Events\BroadcastNotificationCreated', function (data) {
                console.log(data);
            });
        </script>

在调试控制台推送器中订阅App.User.1成功。
同样在Laravel日志中显示了下面的消息:

[11:08:31] LOG.info: Broadcasting [Illuminate\Notifications\Events\BroadcastNotificationCreated] on channels [private-App.User.1] with payload:
{
    "message": "Some Message",
    "action": "#",
    "id": "57d9e4dd-09cd-4cd2-ba3d-06f3fcf2af84",
    "type": "App\\Notifications\\NewChangeRegisterStatusNotif",
    "socket": null
}

但问题是channel.bind()没有被触发。
正如你所看到的,我把Illuminate\Notifications\Events\BroadcastNotificationCreated传递给它,并尝试转义它Illuminate\\Notifications\\Events\\BroadcastNotificationCreated,但它们都不起作用。
问题是什么?

    • 更新:**

我发现,尽管广播事件由laravel,但它不发送到推送器或推送器无法接收它。

dfddblmv

dfddblmv1#

通过下面的操作,我的问题得到了解决:
1-在config/broadcasting.php文件的第18行,我将'default' => env('BROADCAST_DRIVER', 'pusher'),更改为'default' => 'pusher',
2-将var channel = pusher.subscribe('App.User.1');更改为var channel = pusher.subscribe('private-App.User.{{$AuthUser->user_id}}');
3-将channel.bind('Illuminate\Notifications\Events\BroadcastNotificationCreated'转义为channel.bind('Illuminate\\Notifications\\Events\\BroadcastNotificationCreated'
此外,我还遵循了https://stackoverflow.com/a/30396900/498504中描述的所有说明

q5iwbnjs

q5iwbnjs2#

你能登录到Pusher Jmeter 板,转到调试控制台,并粘贴当你从Laravel代码触发它们时出现的事件的JSON吗?
我怀疑你看不到它们的原因是因为你需要绑定到private-App.User.1而不仅仅是App.User.1

ni65a41a

ni65a41a3#

简单的把这个方法添加到你的事件类中

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

您可以在laravel文档www.example.com中阅读更多https://laravel.com/docs/10.x/broadcasting#main-content。
默认情况下,Laravel将使用事件的类名广播事件。但是,您可以通过在事件上定义broadcastAs方法来自定义广播名称:

/**
* The event's broadcast name.
*
* @return string
*/
public function broadcastAs()
{
    return 'server.created';
}

如果使用broadcastAs方法自定义广播名称,则应确保使用前导注册侦听器。字符。这将指示Echo不要将应用程序的命名空间前置到事件:

.listen('.server.created', function (e) {
    //....
});

官方文件:

相关问题