💻 Exemplos: Capítulo 18: Comunicação em Tempo Real com WebSockets (Laravel Reverb)
Especialização em Backend com PHP & Laravel • Demonstrações Práticas Compiláveis
💻 Exemplo 1 — Evento Transmitível em Canal Privado
<?php
namespace App\Events;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\InteractsWithSockets;
use App\Models\Pedido;
class StatusPedidoAtualizadoEvent implements ShouldBroadcast
{
use SerializesModels, InteractsWithSockets;
public function __construct(public Pedido $pedido) {}
public function broadcastOn(): array
{
return [new PrivateChannel('pedidos.' . $this->pedido->user_id)];
}
public function broadcastAs(): string
{
return 'status.atualizado';
}
public function broadcastWith(): array
{
return [
'pedido_id' => $this->pedido->id,
'status' => $this->pedido->status,
];
}
}
<?php
// Disparo do evento em algum ponto do fluxo de negócio
event(new StatusPedidoAtualizadoEvent($pedido));
💻 Exemplo 2 — Autorização de Canal Privado e de Presença
<?php
// routes/channels.php
use Illuminate\Support\Facades\Broadcast;
use App\Models\Pedido;
Broadcast::channel('pedidos.{userId}', function ($user, $userId) {
return (int) $user->id === (int) $userId;
});
Broadcast::channel('chat.{salaId}', function ($user, $salaId) {
// Canal de presença: retorno não-nulo já autoriza e define os dados do usuário presente.
return ['id' => $user->id, 'name' => $user->name];
});
💻 Exemplo 3 — Consumo no Frontend com Laravel Echo
// resources/js/echo.js
import Echo from 'laravel-echo';
import Pusher from 'pusher-js';
window.Pusher = Pusher;
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,
forceTLS: false,
enabledTransports: ['ws'],
});
window.Echo.private(`pedidos.${window.userId}`)
.listen('.status.atualizado', (evento) => {
console.log(`Pedido ${evento.pedido_id} agora está ${evento.status}`);
});