Apprendre la Laravel diffusion d'événements / Echo / Vue et jouer avec ce tutoriel.

Je reçois continuellement 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 le modèle Player 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);
        }
    }

Écouteur ChatMessageNotification (par défaut / 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 discussion que je souhaite utiliser comme canal.

Mon instance de chat vue 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

POST http://my-games.app/broadcasting/auth 403 (Forbidden)
Pusher : Couldn't get auth info from your webapp : 403
1
TheRealPapa 13 août 2017 à 10:33

2 réponses

Au cas où quelqu'un aurait encore besoin d'une réponse, cela a fonctionné pour moi. Ajouter à votre broadcastServiceProvider.php

Broadcast::routes([
'middleware' => 'auth:api']);

Ajouter à vos channels.php

Broadcast::channel('chat', function () {
    return Auth::check();
});
0
Michael Haephrati 21 avril 2020 à 13:08

Cela peut être une idée de savoir si votre fichier routes / channels.php fonctionne comme vous le souhaitez. Ajoutez peut-être une journalisation pour voir si cette route est appelée et que votre fonction inRoom renvoie ce que vous attendez.

0
kn100 14 août 2017 à 11:15