2017-09-14 1 views
0

J'ai configuré Pusher et Laravel Echo pour que mon application avertisse les utilisateurs de certains événements.Pusher ne diffuse pas sur les canaux privés -PHP/Laravel

J'ai testé pour voir si l'installation fonctionne en diffusant sur un "canal public" et vu avec succès que cela fonctionne.

est ici l'événement lui-même:

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'); 
    } 
} 

Canal public:

Broadcast::channel('items', function ($user, $item) { 
    return true; 
}); 

app/ressources/assets/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 
}); 

et l'enregistrement Laravel Echo : (c'est dans la section "head" de ma disposition principale que s'étend la vue de tir de l'événement.)

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

Maintenant, cette configuration fonctionne pour la diffusion de la chaîne publique, mais lorsque je tente de diffuser sur une chaîne privée, je reçois

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

J'ai vérifié les requêtes réseau sortantes à partir de la console de développeur et de découvrir pousse pousse à "POST" à

http://localhost:8000/broadcast/auth 

mais il obtient un code d'erreur 500.

Pensée qui pourrait aider à comprendre le problème.

Que dois-je faire?

+0

C'est une erreur '500'. Vérifiez vos journaux. – Ohgodwhy

+0

oui, mais depuis que mon serveur fonctionne correctement pour la radiodiffusion publique, je ne sais pas où le problème est – QnARails

+0

Comme indiqué ci-dessus. Vérifiez vos journaux. Qu'est-ce-qu'ils disent? – Ohgodwhy

Répondre

1

Donc, j'ai compris comment devrais-je mettre en œuvre l'écoute de canal privé et le faire fonctionner.

Mon erreur était dans le choix générique. Je lui disais d'utiliser l'identifiant de l'utilisateur authentifié comme un caractère générique à la place de l'identifiant de l'élément auquel les modifications sont appliquées. Par conséquent, cet enregistrement en dessous du canal renvoyait toujours false et provoquait le rejet par Pusher de 500 auth.

Broadcast::channel('items.{item}', function ($user, \App\Item $item) { 
    return $user->id === $item->user_id; 
}); 

Donc, voici la version de travail:

événement en cours de diffusion:

//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); 
    } 
} 

enregistrement du canal:

app\routes\channels.php  

Broadcast::channel('items.{item}', function ($user, \App\Item $item) { 
    return $user->id === $item->user_id; 
}); 

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

Merci à tous pour les pointeurs.