【问题标题】:Laravel broadcast works for one userLaravel 广播适用于一个用户
【发布时间】:2019-12-19 01:02:19
【问题描述】:

我正在按照互联网上的一个简单示例进行通知跟踪。不幸的是,到目前为止,我已经设法让它只为一个用户工作。当我打开两个用户时,从 A 到 B 的消息有效,但从 B 到 A 的消息无效。 有人可以帮我吗?

channels.php

Broadcast::channel('App.User.{id}', function ($user, $id) {
    return (int) $user->id === (int) $id;
});

bootstrap.js

window.Pusher = require('pusher-js');
import Echo from "laravel-echo";

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'some-key',
    cluster: 'mt1',
    forceTLS: true
});

global.js

    var urlChannel = 'App.User.' + $('#user_logado_id').val();
    window.Echo.private(urlChannel)
        .notification((notification) => {
            addNotificacao(notification);
        });

向用户发送通知。

$user->notify(new NotificacaoPadrao($param));

我希望向所有用户发送通知。

【问题讨论】:

    标签: php laravel broadcast pusher laravel-echo


    【解决方案1】:

    您可以同时传递发送者和接收者user_id。所以在你的channels.php:

    Broadcast::channel('App.User.{from_user_id}.{to_user_id}', function ($user, $from_user_id, $to_user_id) {
        return (int) $user->id === (int) $from_user_id || (int) $user->id === (int) $to_user_id;
    });
    

    执行此操作时,您应该记住两个用户必须调用相同的频道名称。例如。如果您有用户 12 互相发送消息,则两者的 URL 通道应该是“App.User.1.2”而不是“App.User.2.1”。

    实际上有很多方法可以做到这一点,一种解决方案就是我上面提到的,但这仅适用于 1-1 消息,不适用于群消息。当您想发送群组消息时,您应该创建 2 个表:channels (id, name) 和 channel_users (id, channel_id, user_id)。您的广播频道路线将是这样的:

    Broadcast::channel('App.User.{channel_id}', function ($user, $channel_id) {
        return ChannelUser::where('channel_id', $channel_id)->where('user_id', $user->id)->exists();
    });
    

    【讨论】:

    • 对不起,但据你了解,通知源不在客户端,而是在服务端。服务器发送给特定用户或多个用户。我错了?在我的情况下,我认为在两个用户之间创建频道没有意义。
    • 据我了解,您的解决方案会更优雅,但您的意思是,发送通知的用户必须在同一个频道上吗?更简单的方法是为此使用唯一的频道名称?
    • 是的,用户必须在同一个频道中才能发送和接收通知。您必须先插入一个频道。显然,不在频道中的用户将无法收到通知。
    • 按照这个逻辑,这样应该不行吗? Broadcast::channel('notification', function ($user) { return true; });只是为了测试......
    • 嗯,它会工作,但它会向所有用户发送通知。
    【解决方案2】:

    这是因为第一个用户的频道是 App.User.1,第二个是 App.User.2。您应该为他们创建一个共享的频道。例如:App.Channel.1-2。

    【讨论】:

    • 但是它不会向每个用户的私人频道发送通知吗?还是我必须为所有用户只使用一个频道?
    • 您是要向所有用户发送通知,还是向私人 1-1 频道发送通知?
    • 我有一个邀请系统,当用户A邀请B时,会触发global.js代码,但是当B邀请A时,会发送通知,但不会触发global.js代码跨度>
    • 它应该可以工作。如果$('#user_loagdo_id') 具有当前登录用户的值,那么您正在正确地监听事件。那么你的后端肯定有错误。
    猜你喜欢
    • 2017-08-02
    • 2016-10-17
    • 2021-12-07
    • 1970-01-01
    • 2016-09-03
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    相关资源
    最近更新 更多