You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Laravel实现多客户端/服务器模式临时房间的技术问询

Laravel Multi-Client/Server Room: Handling Client Responses & Room Closure

Hey there! Let's break down how to tackle those final two steps in your Laravel-based multi-client/server application. You’ve already nailed room creation and access control—solid foundation. Here’s how to handle client data submission and server-side room closure once all users respond:

1. Client-to-Server Data Submission

First, you’ll need a secure way for clients to send their responses back to the server. Here’s a step-by-step approach:

  • Define Protected API Routes: Use Laravel’s Sanctum (or session auth if it’s a traditional web app) to protect your submission endpoint so only authenticated, invited users can send data.

    // routes/api.php
    Route::post('/room/{roomId}/submit-response', [RoomController::class, 'submitResponse'])
        ->middleware('auth:sanctum');
    
  • Validate the Request: Ensure the request includes a valid room_id, the user’s response content, and verify the user is actually part of the room (using your roomPlayers table).

    // app/Http/Controllers/RoomController.php
    public function submitResponse(Request $request, $roomId)
    {
        // Validate input
        $validated = $request->validate([
            'response' => 'required|string',
        ]);
    
        // Fetch active room and verify user is a participant
        $room = TempRoom::where('id', $roomId)->where('status', 'active')->firstOrFail();
        $player = RoomPlayers::where('room_id', $roomId)->where('user_id', auth()->id())->firstOrFail();
    
        // Prevent duplicate submissions
        if ($player->response !== null) {
            return response()->json(['message' => 'You’ve already submitted your response!'], 400);
        }
    
        // Store the response (update roomPlayers or link to games table as needed)
        $player->update(['response' => $validated['response']]);
    
        // Trigger check for all completed responses
        $this->checkAndCloseRoom($room);
    
        return response()->json(['message' => 'Response submitted successfully!']);
    }
    
  • Client-Side Implementation: Have your client app send a POST request to this endpoint with the user’s response, including the auth token (for Sanctum) in the request headers.

2. Server-Side: Check All Responses & Close the Room

Once a response is submitted, you need to verify if all invited users have responded, then close the room and notify everyone.

  • Check for Complete Responses: Create a helper method in your controller to count submitted responses vs. total invited players.

    private function checkAndCloseRoom(TempRoom $room)
    {
        $totalPlayers = RoomPlayers::where('room_id', $room->id)->count();
        $completedResponses = RoomPlayers::where('room_id', $room->id)->whereNotNull('response')->count();
    
        // If all players have responded
        if ($completedResponses === $totalPlayers) {
            // 1. Generate summary message (compile all responses)
            $responses = RoomPlayers::where('room_id', $room->id)->with('user')->get();
            $summary = "All responses submitted:\n" . $responses->map(fn($p) => "{$p->user->name}: {$p->response}")->join("\n");
    
            // 2. Notify all clients in real-time (use WebSockets)
            broadcast(new RoomCompletedEvent($room->id, $summary))->toOthers();
    
            // 3. Mark room as closed
            $room->update(['status' => 'closed']);
    
            // Optional: Log to games table if part of a game workflow
            Game::create([
                'room_id' => $room->id,
                'summary' => $summary,
                // Add other game-specific fields
            ]);
        }
    }
    
  • Real-Time Notifications: To instantly alert users when the room closes, use Laravel Echo with a WebSocket service (like Pusher or self-hosted Socket.io). Create a broadcast event for the room’s private channel:

    // app/Events/RoomCompletedEvent.php
    class RoomCompletedEvent implements ShouldBroadcast
    {
        use Dispatchable, InteractsWithSockets, SerializesModels;
    
        public $roomId;
        public $summary;
    
        public function __construct($roomId, $summary)
        {
            $this->roomId = $roomId;
            $this->summary = $summary;
        }
    
        public function broadcastOn()
        {
            return new PrivateChannel("room.{$this->roomId}");
        }
    }
    
  • Block Access to Closed Rooms: Update your room access logic to reject requests for closed rooms. For example, in your room view controller:

    public function showRoom($roomId)
    {
        $room = TempRoom::findOrFail($roomId);
        if ($room->status === 'closed') {
            abort(403, 'This room has been closed.');
        }
        // Load room data for active sessions
    }
    

Key Considerations

  • Concurrency Safety: Avoid race conditions (e.g., two users submitting simultaneously) by wrapping the response check in a database transaction with a lock:
    DB::transaction(function () use ($room) {
        $room->refresh(); // Get latest room state
        if ($room->status === 'active') {
            $this->checkAndCloseRoom($room);
        }
    });
    
  • Client UI Updates: After receiving the room closure event, update your client app’s UI to display the summary and disable further submission attempts.

内容的提问来源于stack exchange,提问作者JahStation

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:11:12