Have you tried with class TicketMessageSent implements ShouldBroadcastNow instead of class TicketMessageSent implements ShouldBroadcast ?
Jul 27, 2025
9
Level 1
Reverb is not receiving event
I am trying to build a real-time chat. So I need reverb to send the messages to everyone live without reloading the page.
Problem is, that the MessageCreatedEvent was not received by reverb. Only th pusher ping is in the log. The queue is working and is dispatching the event correctly.
REMIND: It's a docker compose setup, so vite has to be the real url and Reverb is internal resolved via docker bridge so reverb_host is correct
The channel is found and it should be broadcasted to the correct event:
# .env
REVERB_APP_ID=1234
REVERB_APP_KEY=bxd7gmwhemnahaxwwexj
REVERB_APP_SECRET=qia9xidylaevjvpnaq5t
REVERB_HOST="reverb"
REVERB_PORT=8080
REVERB_SCHEME=http
VITE_REVERB_APP_KEY="${REVERB_APP_KEY}"
VITE_REVERB_HOST="fivem-acp.lvckyworld.localhost"
VITE_REVERB_PORT=80
VITE_REVERB_SCHEME="${REVERB_SCHEME}"
VITE_REVERB_PATH="/reverb"
// routes/channels.php
<?php
use Filament\Http\Middleware\Authenticate;
use Illuminate\Support\Facades\Broadcast;
Broadcast::routes([
'middleware' => Authenticate::class
]);
Broadcast::channel('ticket.{ticketId}', function ($user, $ticketId) {
// $user kann ein Filament-User sein, prüfe ggf. ob er Zugriff auf das Ticket hat
return true;
}, ['guards' => ['filament']]);
// laravel/app/Events/TicketMessageSent.php
<?php
namespace App\Events;
use App\Models\TicketMessage;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class TicketMessageSent implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public TicketMessage $ticketMessage;
public function __construct(TicketMessage $ticketMessage)
{
$this->ticketMessage = $ticketMessage;
}
public function broadcastOn(): PrivateChannel
{
return new PrivateChannel('ticket.' . $this->ticketMessage->ticket_id);
}
public function broadcastWith(): array
{
return [
'message' => $this->ticketMessage->message,
'sender' => [
'id' => $this->ticketMessage->sender->id,
'name' => $this->ticketMessage->sender->name,
'avatar' => $this->ticketMessage->sender->avatar,
],
'created_at' => $this->ticketMessage->created_at->format('d.m.Y H:i'),
];
}
}
// laravel/app/Filament/Resources/TicketResource/Pages/TicketDetails.php
...
public function send(): void
{
$message = $this->data['message'] ?? null;
if (empty($message)) {
session()->flash('error', 'Bitte geben Sie eine Nachricht ein.');
return;
}
$ticketMessage = TicketMessage::create([
'message' => $message,
'ticket_id' => $this->record->id,
'sender_id' => auth()->user()->id,
]);
TicketMessageSent::dispatch($ticketMessage);
session()->flash('success', 'Nachricht gesendet!');
// Kein Reload mehr
$this->reset('data');
}
...
// the blade teplate
...
<x-filament::section class="sticky bottom-0 z-2">
<form wire:submit.prevent="send">
<div class="flex-1">
<div class="filament-forms-component-container">
<div class="filament-forms-rich-editor overflow-auto">
{{ $this->form }}
</div>
</div>
</div>
<x-filament::button type="submit" size="lg" class="h-12 px-6 w-full mt-4 justify-center">
<x-fas-paper-plane class="w-5 h-5 mr-2"/>
</x-filament::button>
</form>
</x-filament::section>
...
@vite('resources/js/ticket-details.js')
// laravel/resources/js/ticket-details.js
import Echo from 'laravel-echo';
import axios from 'axios';
window.axios = axios;
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
const ticketId = document.querySelector('[data-ticket-id]')?.getAttribute('data-ticket-id');
window.Echo = new Echo({
broadcaster: 'reverb',
key: import.meta.env.VITE_REVERB_APP_KEY,
wsHost: import.meta.env.VITE_REVERB_HOST,
wsPort: import.meta.env.VITE_REVERB_PORT ?? 80,
wssPort: import.meta.env.VITE_REVERB_PORT ?? 443,
wsPath: import.meta.env.VITE_REVERB_PATH ?? "/",
forceTLS: (import.meta.env.VITE_REVERB_SCHEME ?? 'https') === 'https',
enabledTransports: ['ws', 'wss'],
});
if (ticketId) {
console.log(ticketId)
window.Echo.private(`ticket.${ticketId}`)
.listen('TicketMessageSent', (e) => {
addMessageToList(e);
});
}
Please or to participate in this conversation.