我正在尝试使用Laravel Echo收听私人频道,但它不只在私人频道上收听,公共频道可以正常工作。
我还使用了 beyondcode / Laravel-Websockets 包,它在websockets仪表板面板中显示了所有连接和事件。它显示了包本身建立的私人连接,我的公共连接以及所有触发的事件(私人和公共),但没有显示我的私人连接
如果事件被触发并将数据保存在数据库中,则所有工作都很好,除了在视图中,我没有从触发的私有事件中接收任何数据
当预定义为“ ^ 1.5.4”
时,我尝试将Laravel Echo版本降级为“ ^ 1.3.2”这是我在私人频道播出的laravel事件
<?php
namespace App\Events;
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
class NuevoGasto implements ShouldBroadcastNow
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $gasto;
public function __construct($gasto)
{
$this->gasto = $gasto;
}
public function broadcastOn()
{
return new PrivateChannel('nuevo-gasto-channel');
}
}
请注意,我使用的是 ShouldBroadcastNow 特征,因此我不需要使用队列
这是我的bootstrap.js文件,其中包含我的Laravel Echo配置
import Echo from 'laravel-echo'
window.Pusher = require('pusher-js');
window.Echo = new Echo({
broadcaster: 'pusher',
key: process.env.MIX_PUSHER_APP_KEY,
cluster: process.env.MIX_PUSHER_APP_CLUSTER,
wsHost: window.location.hostname,
wsPort: 6001,
disableStats: true,
});
这是我的route / channels.php文件
Broadcast::channel('nuevo-gasto-channel', function ($user) {
return true;
});
请注意,出于演示目的,我将返回true
这是我在nuevo-gasto-channel上监听NuevoGasto事件时的视图文件
Echo.private('nuevo-gasto-channel')
.listen('NuevoGasto', (e) => {
console.log(e);
});
最后这是我的控制器,在这里触发事件
...
broadcast(new NuevoGasto($gasto))->toOthers();
...
我没有收到任何错误,只是没有在私人频道上收听
答案 0 :(得分:1)
如果还没有,请尝试在App\Providers\BroadcastServiceProvider::class
中取消注释config/app.php
。
答案 1 :(得分:1)
在“NuevoGasto”事件中添加一个点
应该是这样的:
enter code here Echo.private('nuevo-gasto-channel')
.listen('.NuevoGasto', (e) => {
console.log(e);
});
答案 2 :(得分:0)
正如 Laravel 文档中提到的。 Doc
您仅用于其他人,这意味着它不会向您当前的用户发送事件。
尝试使用此处提到的直接事件调度Doc
并且请记住以下有关广播名称和命名空间的事项。
正如 Laravel 文档中提到的那样。 Doc
默认情况下,Laravel 将使用事件的类名广播事件。但是,您可以通过在事件上定义 broadcastAs
方法来自定义广播名称:
/**
* The event's broadcast name.
*
* @return string
*/
public function broadcastAs()
{
return 'server.created';
}
如果您使用 broadcastAs
方法自定义广播名称,则应确保使用前导 .
字符注册您的侦听器。
这将指示 Echo 不要将应用程序的命名空间添加到事件中:
.listen('.server.created', function (e) {
....
});
正如这里提到的,你也可以使用命名空间 Doc
您可能已经注意到,在上面的示例中,我们没有为事件类指定完整的 App\Events
命名空间。这是因为 Echo 会自动假定事件位于 App\Events
命名空间中。但是,您可以在实例化 Echo 时通过传递 namespace
配置选项来配置根命名空间:
window.Echo = new Echo({
broadcaster: 'pusher',
// ...
namespace: 'App.Other.Namespace'
});
或者,您可以在使用 Echo 订阅事件类时使用 .
前缀。这将允许您始终指定完全限定的类名:
Echo.channel('orders')
.listen('.Namespace\\Event\\Class', (e) => {
//
})