2017-08-13 1 views
1

Apprentissage Laravel diffusion de l'événement/Echo/Vue et de jouer avec this tutorial.Échec de l'authentification Laravel Echo/Pusher (403)

Je continue d'obtenir 403 réponses à l'authentification, et je soupçonne que mon manque de compréhension sur les routes channels.php est le problème. J'utilise Player modèle au lieu de User pour Auth qui fonctionne bien.

événement ChatMessageSend

class ChatMessageSent implements ShouldBroadcast 
{ 
    use Dispatchable, InteractsWithSockets, SerializesModels; 

    public $channel; 
    public $player; 
    public $chatMessage; 

     /** 
     * Create a new event instance. 
     * GameChat constructor. 
     * @param $chatMessage 
     * @param $player 
     */ 
     public function __construct(ChatMessage $chatMessage, Player $player) 
     { 
      $this->channel = session()->get('chat.channel'); 

      $this->chatMessage = $chatMessage; 

      $this->player = $player; 
     } 

     /** 
     * Get the channels the event should broadcast on. 
     * 
     * @return Channel|array 
     */ 
     public function broadcastOn() 
     { 
      return new PrivateChannel($this->channel); 
     } 
    } 

Listener ChatMessageNotification (default/vide)

class ChatMessageNotification 
{ 
    /** 
    * ChatMessageNotification constructor. 
    */ 
    public function __construct() 
    { 
     // 
    } 

    /** 
    * Handle the event. 
    * 
    * @param ChatMessageSent $event 
    * @return void 
    */ 
    public function handle(ChatMessageSent $event) 
    { 
     // 
    } 
} 

Contrôleur ChatController

class ChatController extends Controller 
{ 
    /** 
    * Send chat message 
    * 
    * @param Request $request 
    * @return \Illuminate\Database\Eloquent\Collection|static[] 
    */ 
    public function getMessages(Request $request) 
    { 
     return ChatMessage::with('player') 
      ->where('progress_id', '=', session('game.progress.id')) 
      ->orderBy('created_at', 'DESC') 
      ->get(); 
    } 

    /** 
    * Send chat message 
    * 
    * @param Request $request 
    * @return array|string 
    */ 
    public function sendMessage(Request $request) 
    { 
     $player = Auth::user(); 

     $message = $request->input('message'); 

     if ($message) { 
      $message = ChatMessage::create([ 
       'player_id' => $player->id, 
       'progress_id' => session()->get('game.progress.id'), 
       'message'  => $request->input('message') 
      ]); 
     } 

     broadcast(new ChatMessageSent($player, $message))->toOthers(); 

     return ['type' => 'success']; 
    } 
} 

Routes channels.php

Broadcast::channel(session()->get('chat.channel'), function ($player, $message) { 
    return $player->inRoom(); 
}); 

Et dans ma classe Player

/** 
* A user can be in one chat channel 
*/ 
public function inRoom() 
{ 
    if ((Auth::check()) and ($this->games()->where('progress_id', '=', session('game.progress.id'))->get())) { 
     return true; 
    } 

    return false; 
} 

Lorsqu'un joueur se connecte, je stocke en session, un identifiant de salle de chat que je voudrais utiliser comme canal.

Mon vue exemple de chat est

Vue.component('chat-messages', require('./../generic/chat-messages.vue')); 
Vue.component('chat-form', require('./../generic/chat-form.vue')); 

const app = new Vue({ 
    el: '#toolbar-chat', 

    data: { 
     messages: [] 
    }, 

    created() { 
     this.fetchMessages(); 

     Echo.private(chat_channel) 
     .listen('chatmessagesent', (e) => { 
      this.messages.unshift({ 
       message: e.data.message, 
       player: e.data.player.nickname 
      }); 
     }); 
    }, 

    methods: { 
     fetchMessages() { 
      axios.get(chat_get_route) 
      .then(response => { 
       this.messages = response.data; 
      }); 
     }, 

     addMessage(message) { 
      this.messages.unshift(message); 

      this.$nextTick(() => { 
       this.$refs.toolbarChat.scrollTop = 0; 
      }); 

      axios.post(chat_send_route, message) 
      .then(response => { 
       console.log(response.data); 
      }); 

     } 
    } 
}); 

Mais je continue à avoir

POST http://my-games.app/broadcasting/auth 403 (Forbidden) 
Pusher : Couldn't get auth info from your webapp : 403 

Répondre

0

Il peut être une idée de savoir si vos routes/fichier channels.php est en train de faire comme prévu. Peut-être ajouter une connexion pour voir si cette route est appelée du tout, et que votre fonction inRoom retourne ce que vous attendez.