dani03
dani03 686 XP
a posé

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<?php
2class MessageAddedEvent implements ShouldBroadcast
3{
4 use Dispatchable, InteractsWithSockets, SerializesModels;
5 
6 public $message;
7 /**
8 * Create a new event instance.
9 *
10 * @return void
11 */
12 public function __construct(Message $message)
13 {
14 
15 $this->message = $message;
16 }
17 
18 public function broadcastWith()
19 {
20 
21 return [
22 'message' => [
23 'id' => $this->message->id
24 ]
25 ];
26 }
27 /**
28 * Get the channels the event should broadcast on.
29 *
30 * @return \Illuminate\Broadcasting\Channel|array
31 */
32 public function broadcastOn()
33 {
34 
35 return new PrivateChannel('discussion.' . $this->message->conversation->id);
36 }
1<?php
2class MessageAddedEvent implements ShouldBroadcast
3{
4 use Dispatchable, InteractsWithSockets, SerializesModels;
5 
6 public $message;
7 /**
8 * Create a new event instance.
9 *
10 * @return void
11 */
12 public function __construct(Message $message)
13 {
14 
15 $this->message = $message;
16 }
17 
18 public function broadcastWith()
19 {
20 
21 return [
22 'message' => [
23 'id' => $this->message->id
24 ]
25 ];
26 }
27 /**
28 * Get the channels the event should broadcast on.
29 *
30 * @return \Illuminate\Broadcasting\Channel|array
31 */
32 public function broadcastOn()
33 {
34 
35 return new PrivateChannel('discussion.' . $this->message->conversation->id);
36 }

dans un de mes qui composant livewire je diffuse l'evenement

1<?php
2 
3namespace App\Http\Livewire\Conversations;
4 
5use 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;
11 
12class ConversationReply extends Component
13{
14 public $body;
15 public $conversation;
16 
17 public function mount(Conversation $conversation)
18 {
19 $this->conversation = $conversation;
20 }
21 
22 public function reply()
23 {
24 
25 $this->validate([
26 'body' => 'required'
27 ]);
28 
29 //on met a jour la date du dernier message
30 $this->conversation->update([
31 'last_message_at' => now()
32 ]);
33 
34 $message = $this->conversation->messages()->create([
35 'user_id' => auth()->id(),
36 'body' => $this->body,
37 
38 ]);
39 
40 foreach ($this->conversation->others as $user) {
41 
42 $user->conversations()->updateExistingPivot($this->conversation, [
43 'read_at' => null
44 ]);
45 }
46 broadcast(new MessageAddedEvent($message))->toOthers();
47 
48 //ensuite on emet un evenement
49 $this->emit('message.created', $message->id);
50 $this->body = '';
51 }
1<?php
2 
3namespace App\Http\Livewire\Conversations;
4 
5use 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;
11 
12class ConversationReply extends Component
13{
14 public $body;
15 public $conversation;
16 
17 public function mount(Conversation $conversation)
18 {
19 $this->conversation = $conversation;
20 }
21 
22 public function reply()
23 {
24 
25 $this->validate([
26 'body' => 'required'
27 ]);
28 
29 //on met a jour la date du dernier message
30 $this->conversation->update([
31 'last_message_at' => now()
32 ]);
33 
34 $message = $this->conversation->messages()->create([
35 'user_id' => auth()->id(),
36 'body' => $this->body,
37 
38 ]);
39 
40 foreach ($this->conversation->others as $user) {
41 
42 $user->conversations()->updateExistingPivot($this->conversation, [
43 'read_at' => null
44 ]);
45 }
46 broadcast(new MessageAddedEvent($message))->toOthers();
47 
48 //ensuite on emet un evenement
49 $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<?php
2 
3 class ConversationMessages extends Component
4{
5 public $conversationId;
6 public $messages;
7 
8 
9 public function mount(Conversation $conversation, Collection $messages)
10 {
11 $this->conversationId = $conversation->id;
12 $this->messages = $messages;
13 }
14 
15 
16 public function getListeners()
17 {
18 
19 return
20 [
21 'message.created' => 'prepend_message',
22 "echo-private:discussion.{$this->conversationId},Conversations\\MessageAddedEvent" => "prependMessageFromBroadcast",
23 ];
24 }
25 
26 //push methode ajoute un element en fin de collection
27 public function prepend_message(int $message_id)
28 {
29 $this->messages->push(Message::find($message_id));
30 }
31 
32 public function prependMessageFromBroadcast($payload)
33 {
34 
35 $this->prepend_message($payload['message']['id']);
36 }
1<?php
2 
3 class ConversationMessages extends Component
4{
5 public $conversationId;
6 public $messages;
7 
8 
9 public function mount(Conversation $conversation, Collection $messages)
10 {
11 $this->conversationId = $conversation->id;
12 $this->messages = $messages;
13 }
14 
15 
16 public function getListeners()
17 {
18 
19 return
20 [
21 'message.created' => 'prepend_message',
22 "echo-private:discussion.{$this->conversationId},Conversations\\MessageAddedEvent" => "prependMessageFromBroadcast",
23 ];
24 }
25 
26 //push methode ajoute un element en fin de collection
27 public function prepend_message(int $message_id)
28 {
29 $this->messages->push(Message::find($message_id));
30 }
31 
32 public function prependMessageFromBroadcast($payload)
33 {
34 
35 $this->prepend_message($payload['message']['id']);
36 }

voila si quelqu'un voit d'où vient mon problème je serais ravis merci

dy05
dy05 36 XP
a répondu

As tu bien ajoute cette recommandation dans le fichier config/app.php .? https://laravel.com/docs/9.x/broadcasting#broadcast-service-pr...

Confirmer la suppression

Êtes-vous sûr de vouloir supprimer cette réponse ? Cette action est irréversible.

dani03
dani03 686 XP
a répondu

oui j'ai bien décommenté la ligne App\Providers\BroadcastServiceProvider::class,

Confirmer la suppression

Êtes-vous sûr de vouloir supprimer cette réponse ? Cette action est irréversible.

dy05
dy05 36 XP
a répondu

Tu peux fournir le repo github.?

Confirmer la suppression

Êtes-vous sûr de vouloir supprimer cette réponse ? Cette action est irréversible.

dani03
dani03 686 XP
a répondu

ah mince c'est sur gitlab je le mets sur github et je l'envoie

Confirmer la suppression

Êtes-vous sûr de vouloir supprimer cette réponse ? Cette action est irréversible.

Confirmer la suppression

Êtes-vous sûr de vouloir supprimer cette réponse ? Cette action est irréversible.

dani03
dani03 686 XP
a répondu

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}}"}}
Confirmer la suppression

Êtes-vous sûr de vouloir supprimer cette réponse ? Cette action est irréversible.

Il faut Se connecter ou Créer un compte pour participer à cette conversation.

Confirmer la suppression

Êtes-vous sûr de vouloir supprimer ce sujet ? Cette action est irréversible.