problème de diffussion de message en temps réel laravel

dani03 @dani03 551 XP a posé dans

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

<?php
class MessageAddedEvent implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
 
public $message;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(Message $message)
{
 
$this->message = $message;
}
 
public function broadcastWith()
{
 
return [
'message' => [
'id' => $this->message->id
]
];
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
 
return new PrivateChannel('discussion.' . $this->message->conversation->id);
}

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

<?php
 
namespace App\Http\Livewire\Conversations;
 
use App\Events\Conversations\MessageAddedEvent;
use App\Events\conversations\MessageAjouter;
use App\Http\Requests\MessageRequest;
use App\Models\Conversation;
use Illuminate\Support\Facades\Broadcast;
use Livewire\Component;
 
class ConversationReply extends Component
{
public $body;
public $conversation;
 
public function mount(Conversation $conversation)
{
$this->conversation = $conversation;
}
 
public function reply()
{
 
$this->validate([
'body' => 'required'
]);
 
//on met a jour la date du dernier message
$this->conversation->update([
'last_message_at' => now()
]);
 
$message = $this->conversation->messages()->create([
'user_id' => auth()->id(),
'body' => $this->body,
 
]);
 
foreach ($this->conversation->others as $user) {
 
$user->conversations()->updateExistingPivot($this->conversation, [
'read_at' => null
]);
}
broadcast(new MessageAddedEvent($message))->toOthers();
 
//ensuite on emet un evenement
$this->emit('message.created', $message->id);
$this->body = '';
}

et ensuite les channels

Broadcast::channel('discussion.{id}', function ($user, $id) {
dd('toto');
return true;
// return $user->inConversation($id);
});

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.

<?php
 
class ConversationMessages extends Component
{
public $conversationId;
public $messages;
 
 
public function mount(Conversation $conversation, Collection $messages)
{
$this->conversationId = $conversation->id;
$this->messages = $messages;
}
 
 
public function getListeners()
{
 
return
[
'message.created' => 'prepend_message',
"echo-private:discussion.{$this->conversationId},Conversations\\MessageAddedEvent" => "prependMessageFromBroadcast",
];
}
 
//push methode ajoute un element en fin de collection
public function prepend_message(int $message_id)
{
$this->messages->push(Message::find($message_id));
}
 
public function prependMessageFromBroadcast($payload)
{
 
$this->prepend_message($payload['message']['id']);
}

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

  • dani03
    dani @dani03

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

  • Tu peux fournir le repo github.?

  • dani03
    dani @dani03

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

  • dani03
    dani @dani03

    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

    Connection 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}}"}}

Veuillez vous connecter ou créer un compte pour participer à cette conversation.