Broadcasting

Learn how to broadcast messages to multiple clients using Sockeon's broadcasting system.

Types of Broadcasting

Global Broadcasting

Send messages to all connected clients:

class GlobalBroadcastController extends SocketController
{
    #[SocketOn('server.announcement')]
    public function serverAnnouncement(int $clientId, array $data): void
    {
        $message = $data['message'] ?? '';
        
        // Broadcast to all connected clients
        $this->broadcast('server.announcement', [
            'message' => $message,
            'from' => 'server',
            'timestamp' => time()
        ]);
        
        // Confirm to sender
        $this->emit($clientId, 'announcement.sent', [
            'message' => 'Announcement sent to all clients'
        ]);
    }
}

Namespace Broadcasting

Send messages to all clients in a specific namespace:

class NamespaceBroadcastController extends SocketController
{
    #[SocketOn('namespace.broadcast')]
    public function namespaceBroadcast(int $clientId, array $data): void
    {
        $namespace = $data['namespace'] ?? '/';
        $message = $data['message'] ?? '';
        
        // Broadcast to specific namespace
        $this->broadcastToNamespaceClients('namespace.message', [
            'message' => $message,
            'from_client' => $clientId,
            'namespace' => $namespace,
            'timestamp' => time()
        ], $namespace);
        
        $this->emit($clientId, 'broadcast.sent', [
            'namespace' => $namespace
        ]);
    }
}

Room Broadcasting

Send messages to all clients in a specific room:

class RoomBroadcastController extends SocketController
{
    #[SocketOn('room.message')]
    public function roomMessage(int $clientId, array $data): void
    {
        $room = $data['room'] ?? '';
        $message = $data['message'] ?? '';
        
        if (empty($room)) {
            $this->emit($clientId, 'error', ['message' => 'Room is required']);
            return;
        }
        
        // Broadcast to specific room
        $this->broadcastToRoomClients('room.message', [
            'message' => $message,
            'from_client' => $clientId,
            'room' => $room,
            'timestamp' => time()
        ], $room);
        
        $this->emit($clientId, 'message.sent', [
            'room' => $room
        ]);
    }
}

Broadcasting Patterns

Chat Application

class ChatController extends SocketController
{
    #[SocketOn('chat.message')]
    public function handleMessage(int $clientId, array $data): void
    {
        $message = $data['message'] ?? '';
        $room = $data['room'] ?? 'general';
        
        if (empty($message)) {
            $this->emit($clientId, 'error', ['message' => 'Message cannot be empty']);
            return;
        }
        
        // Broadcast to room
        $this->broadcastToRoomClients('chat.message', [
            'from' => $clientId,
            'message' => $message,
            'room' => $room,
            'timestamp' => time()
        ], $room);
    }

    #[SocketOn('chat.typing')]
    public function handleTyping(int $clientId, array $data): void
    {
        $isTyping = $data['typing'] ?? false;
        $room = $data['room'] ?? 'general';
        
        // Broadcast typing status to room
        $this->broadcastToRoomClients('chat.typing', [
            'clientId' => $clientId,
            'typing' => $isTyping,
            'room' => $room
        ], $room);
    }
}

Game Broadcasting

class GameController extends SocketController
{
    #[SocketOn('game.move')]
    public function handleMove(int $clientId, array $data): void
    {
        $gameId = $data['gameId'] ?? '';
        $move = $data['move'] ?? '';
        
        if (empty($gameId)) {
            $this->emit($clientId, 'error', ['message' => 'Game ID is required']);
            return;
        }
        
        // Broadcast move to game room
        $this->broadcastToRoomClients('game.move', [
            'player' => $clientId,
            'move' => $move,
            'gameId' => $gameId,
            'timestamp' => time()
        ], $gameId);
    }

    #[SocketOn('game.chat')]
    public function handleGameChat(int $clientId, array $data): void
    {
        $gameId = $data['gameId'] ?? '';
        $message = $data['message'] ?? '';
        
        // Broadcast chat to game room
        $this->broadcastToRoomClients('game.chat', [
            'player' => $clientId,
            'message' => $message,
            'gameId' => $gameId,
            'timestamp' => time()
        ], $gameId);
    }
}

Broadcasting Methods

Available Methods

class BroadcastingExamples extends SocketController
{
    #[SocketOn('example.broadcast')]
    public function exampleBroadcast(int $clientId, array $data): void
    {
        // Broadcast to all clients
        $this->broadcast('event.name', ['data' => 'value']);
        
        // Broadcast to specific namespace
        $this->broadcastToNamespaceClients('event.name', ['data' => 'value'], '/namespace');
        
        // Broadcast to specific room
        $this->broadcastToRoomClients('event.name', ['data' => 'value'], 'room_name');
        
        // Send to specific client
        $this->emit($clientId, 'event.name', ['data' => 'value']);
    }
}