réponses
212 vues
problème de diffussion de message en temps réel laravel
Bonjour l’équipe j’ai un problème avec laravel… je n’arrive pas à diffuser mon évènement sur un channel privé.. je suivais un tuto mais ça marche chez lui mais j'ai tout fait regarder la doc et tout mais rien ne marche du moins je n'arrive pas a avoir le message instantané j’utilise laravel-webSockets...
ici le code de mon event MessageAddedEvent
1<?php2class MessageAddedEvent implements ShouldBroadcast3{4 use Dispatchable, InteractsWithSockets, SerializesModels;56 public $message;7 /**8 * Create a new event instance.9 *10 * @return void11 */12 public function __construct(Message $message)13 {1415 $this->message = $message;16 }1718 public function broadcastWith()19 {2021 return [22 'message' => [23 'id' => $this->message->id24 ]25 ];26 }27 /**28 * Get the channels the event should broadcast on.29 *30 * @return \Illuminate\Broadcasting\Channel|array31 */32 public function broadcastOn()33 {3435 return new PrivateChannel('discussion.' . $this->message->conversation->id);36 }1<?php2class MessageAddedEvent implements ShouldBroadcast3{4 use Dispatchable, InteractsWithSockets, SerializesModels;56 public $message;7 /**8 * Create a new event instance.9 *10 * @return void11 */12 public function __construct(Message $message)13 {1415 $this->message = $message;16 }1718 public function broadcastWith()19 {2021 return [22 'message' => [23 'id' => $this->message->id24 ]25 ];26 }27 /**28 * Get the channels the event should broadcast on.29 *30 * @return \Illuminate\Broadcasting\Channel|array31 */32 public function broadcastOn()33 {3435 return new PrivateChannel('discussion.' . $this->message->conversation->id);36 }
dans un de mes qui composant livewire je diffuse l'evenement
1<?php23namespace App\Http\Livewire\Conversations;45use App\Events\Conversations\MessageAddedEvent;6use App\Events\conversations\MessageAjouter;7use App\Http\Requests\MessageRequest;8use App\Models\Conversation;9use Illuminate\Support\Facades\Broadcast;10use Livewire\Component;1112class ConversationReply extends Component13{14 public $body;15 public $conversation;1617 public function mount(Conversation $conversation)18 {19 $this->conversation = $conversation;20 }2122 public function reply()23 {2425 $this->validate([26 'body' => 'required'27 ]);2829 //on met a jour la date du dernier message30 $this->conversation->update([31 'last_message_at' => now()32 ]);3334 $message = $this->conversation->messages()->create([35 'user_id' => auth()->id(),36 'body' => $this->body,3738 ]);3940 foreach ($this->conversation->others as $user) {4142 $user->conversations()->updateExistingPivot($this->conversation, [43 'read_at' => null44 ]);45 }46 broadcast(new MessageAddedEvent($message))->toOthers();4748 //ensuite on emet un evenement49 $this->emit('message.created', $message->id);50 $this->body = '';51 }1<?php23namespace App\Http\Livewire\Conversations;45use App\Events\Conversations\MessageAddedEvent;6use App\Events\conversations\MessageAjouter;7use App\Http\Requests\MessageRequest;8use App\Models\Conversation;9use Illuminate\Support\Facades\Broadcast;10use Livewire\Component;1112class ConversationReply extends Component13{14 public $body;15 public $conversation;1617 public function mount(Conversation $conversation)18 {19 $this->conversation = $conversation;20 }2122 public function reply()23 {2425 $this->validate([26 'body' => 'required'27 ]);2829 //on met a jour la date du dernier message30 $this->conversation->update([31 'last_message_at' => now()32 ]);3334 $message = $this->conversation->messages()->create([35 'user_id' => auth()->id(),36 'body' => $this->body,3738 ]);3940 foreach ($this->conversation->others as $user) {4142 $user->conversations()->updateExistingPivot($this->conversation, [43 'read_at' => null44 ]);45 }46 broadcast(new MessageAddedEvent($message))->toOthers();4748 //ensuite on emet un evenement49 $this->emit('message.created', $message->id);50 $this->body = '';51 }
et ensuite les channels
1Broadcast::channel('discussion.{id}', function ($user, $id) {2 dd('toto');3 return true;4 // return $user->inConversation($id);5});1Broadcast::channel('discussion.{id}', function ($user, $id) {2 dd('toto');3 return true;4 // return $user->inConversation($id);5});
je n'arrive pas non plus a executer mon dd('toto') donc je n'ai meme pas accès a cette route de channel
mon problème ici est que je n'arrive pas à recevoir les messages en temps réel je suis obligé de recharger la page et pourtant j'ai suivi toutes les étapes pour le faire
ensuite mon composant ConversationMessages ou je crée des listeners pour écouter les différents events.
mais sur la liigne "echo-private:discussion.{$this->conversationId},Conversations\\MessageAddedEvent" => "prependMessageFromBroadcast" je fais appel a la méthode prependMessageFromBroadcast mais je n'arrive pas acceder a celle ci.
1<?php23 class ConversationMessages extends Component4{5 public $conversationId;6 public $messages;789 public function mount(Conversation $conversation, Collection $messages)10 {11 $this->conversationId = $conversation->id;12 $this->messages = $messages;13 }141516 public function getListeners()17 {1819 return20 [21 'message.created' => 'prepend_message',22 "echo-private:discussion.{$this->conversationId},Conversations\\MessageAddedEvent" => "prependMessageFromBroadcast",23 ];24 }2526 //push methode ajoute un element en fin de collection27 public function prepend_message(int $message_id)28 {29 $this->messages->push(Message::find($message_id));30 }3132 public function prependMessageFromBroadcast($payload)33 {3435 $this->prepend_message($payload['message']['id']);36 }1<?php23 class ConversationMessages extends Component4{5 public $conversationId;6 public $messages;789 public function mount(Conversation $conversation, Collection $messages)10 {11 $this->conversationId = $conversation->id;12 $this->messages = $messages;13 }141516 public function getListeners()17 {1819 return20 [21 'message.created' => 'prepend_message',22 "echo-private:discussion.{$this->conversationId},Conversations\\MessageAddedEvent" => "prependMessageFromBroadcast",23 ];24 }2526 //push methode ajoute un element en fin de collection27 public function prepend_message(int $message_id)28 {29 $this->messages->push(Message::find($message_id));30 }3132 public function prependMessageFromBroadcast($payload)33 {3435 $this->prepend_message($payload['message']['id']);36 }
voila si quelqu'un voit d'où vient mon problème je serais ravis merci
As tu bien ajoute cette recommandation dans le fichier config/app.php .? https://laravel.com/docs/9.x/broadcasting#broadcast-service-pr...
oui j'ai bien décommenté la ligne App\Providers\BroadcastServiceProvider::class,
j'arrive desormais à voir dans les log de serve websockets quand j'envoie un message mais il n'arrive toujours pas de façon instantané a celui qui reçoit le message
1Connection id 541484910.242224924 sending message {"event":"log-message","channel":"private-websockets-dashboard-api-message","data":{"type":"api-message","time":"17:07:36","details":"Channel: private-conversations.6, Event: App\\Events\\Conversations\\MessageAddedEvent","data":"{\"message\":{\"id\":144}}"}}1Connection id 541484910.242224924 sending message {"event":"log-message","channel":"private-websockets-dashboard-api-message","data":{"type":"api-message","time":"17:07:36","details":"Channel: private-conversations.6, Event: App\\Events\\Conversations\\MessageAddedEvent","data":"{\"message\":{\"id\":144}}"}}
Il faut Se connecter ou Créer un compte pour participer à cette conversation.