2017-09-14 176 views
0

我为我的应用设置了Pusher和Laravel Echo,以通知用户某些事件触发。推送器不在私有通道上广播-PHP/Laravel

我已经测试过,看看安装程序是否在“公共频道”上播放,并成功地看到这是有效的。

这里是事件本身:

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回声登记:(它是在我的主布局的“头部”部分,事件触发视图从中延伸。)

<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

这是一个'500'错误。检查你的日志。 – Ohgodwhy

+0

是的,但由于我的服务器在公共广播中正常工作,我不知道问题出在哪里 – QnARails

+0

如上所述。检查你的日志。他们说什么? – Ohgodwhy

回答

1

所以我想通了如何实现私人通道听,并得到它的工作。

我的错误是在通配符选择。

我告诉它使用通过身份验证的用户ID作为通配符而不是应用更改的项目ID。

因此,下面的这个渠道注册总是返回错误并导致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回声登记:

<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> 

谢谢大家的指针。