我为我的应用设置了Pusher和Laravel Echo,以便在某些事件发生时通知用户。
我已经通过广播在“公共频道”上进行测试,看看设置是否有效,并且成功看到它是有效的。
这是事件本身:
class ItemUpdated implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $item;
public function __construct(Item $item)
{
$this->item = $item;
}
public function broadcastOn()
{
return new Channel('items');
}
}
公共频道:
Broadcast::channel('items', function ($user, $item) {
return true;
});
应用程序/资源/资产/ JS / bootstrap.js:
import Echo from 'laravel-echo';
window.Pusher = require('pusher-js');
window.Echo = new Echo({
broadcaster: 'pusher',
key: 'my_key',
cluster: 'eu',
encrypted: true
});
和Laravel Echo注册:(它在我的主要布局的“头部”部分中,事件触发视图延伸。)
<head>
<meta charset="utf-8">
<meta name="csrf-token" content="{{ csrf_token() }}">
<script src="{{ asset('js/app.js') }}"></script>
<script>
window.Laravel = {'csrfToken': '{{csrf_token()}}'}
window.Echo.channel('items')
.listen('ItemUpdated', function(e) {
console.log("It is working:)");
});
</script>
</head>
现在,此设置适用于公共频道广播,但当我尝试在私人频道播放时,我得到了
//updated "ItemUpdated" event broadcastOn() method
public function broadcastOn()
{
return new PrivateChannel('items');
}
//updated laravel echo registering
<script>
window.Laravel = {'csrfToken': '{{csrf_token()}}'}
window.Echo.private('items')
.listen('ItemUpdated', function(e) {
console.log("It is working:)");
});
//console logged error
Pusher couldn't get the auth user from :myapp 500
我检查了来自开发者控制台的传出网络请求,并发现推送器正在尝试“POST”到
http://localhost:8000/broadcast/auth
但它得到500错误代码。
可能有助于解决问题的想法。
我该怎么办?
答案 0 :(得分:2)
所以我想出了如何实现私人频道收听并让它发挥作用。
我的错误在于通配符选择。
我告诉它使用经过身份验证的用户ID作为通配符,而不是应用更改的项ID。
因此,以下频道注册总是返回false,导致Pusher无法发现500个auth。
Broadcast::channel('items.{item}', function ($user, \App\Item $item) {
return $user->id === $item->user_id;
});
正在播放的广告:
//ItemUpdated event
class ItemUpdated implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $item;
public function __construct(Item $item)
{
$this->item = $item;
}
public function broadcastOn()
{
return new PrivateChannel('items.'.$this->item->id);
}
}
频道注册:
app\routes\channels.php
Broadcast::channel('items.{item}', function ($user, \App\Item $item) {
return $user->id === $item->user_id;
});
Laravel Echo注册:
<head>
<meta name="csrf-token" content="{{ csrf_token() }}">
<script>
window.Laravel = {'csrfToken': '{{csrf_token()}}'}
window.Echo.private(`items.{{{$item->id}}}`)
.listen('ItemUpdated', function(e) {
console.log("It is working!");
});
</script>
谢谢大家指点。