Here’s a step-by-step guide to building a private chat real-time system using Laravel 11, Reverb, and Redis.
Step 1: Install Laravel 11
If you haven’t already installed Laravel 11, create a new project:
Then, install dependencies:
Step 2: Install & Configure Laravel Reverb
1️⃣ Install Reverb
2️⃣ Publish Reverb config file
3️⃣ Update .env to use Redis broadcasting
4️⃣ Update config/broadcasting.php to use Redis
5️⃣ Start Redis
Step 3: Create WebSocket Channel for Private Chat
1️⃣ Define a private channel in routes/channels.php
💡 This ensures only authenticated users can listen to their own chat events.
Step 4: Create a Chat Model & Migration
1️⃣ Generate Chat Model & Migration
2️⃣ Define the Schema in database/migrations/YYYY_MM_DD_create_chats_table.php
3️⃣ Run Migration
Step 5: Create Chat Event
1️⃣ Generate an Event
2️⃣ Edit app/Events/MessageSent.php
💡 This event will broadcast new messages to the receiver’s private channel.
Step 6: Create Chat Controller
1️⃣ Generate a Chat Controller
2️⃣ Edit app/Http/Controllers/ChatController.php
💡 This method stores the message and broadcasts it to the receiver.
Step 7: Define API Route
Edit routes/api.php:
💡 Ensure your API uses auth:sanctum or another authentication method.
Step 8: Start Reverb WebSocket Server
1️⃣ Run Laravel Queues (Redis required)
2️⃣ Start Laravel Reverb
Step 9: Frontend Integration (Example in JavaScript)
Here’s how to listen for messages using Laravel Echo:
1️⃣ Install Laravel Echo & Pusher JS
2️⃣ Configure Laravel Echo in resources/js/bootstrap.js
3️⃣ Listen for messages (Example in Vue.js or React)
Step 10: Test Everything
1️⃣ Start Laravel Backend
2️⃣ Start Reverb
3️⃣ Send a Message using Postman or Frontend
4️⃣ Check if the receiver gets the real-time message!
How to Scale Laravel Reverb for Multi-Server?
- Ensure Redis is used for broadcasting (
BROADCAST_CONNECTION=redis). - Deploy Laravel on multiple servers.
- Run
php artisan reverb:starton each server. - Use a Load Balancer (e.g., Nginx, AWS ALB) to route WebSocket traffic.
- Enable Redis clustering for large-scale chat applications.
Summary
✅ Laravel Reverb provides a native WebSocket solution for Laravel 11.
✅ Redis is used to broadcast events across multiple servers.
✅ Private Channels ensure secure messaging.
✅ Frontend listens for messages using Laravel Echo.
✅ For multi-server support, use Redis + Load Balancer.
Would you like a Docker setup for a production-ready chat app? 🚀
Xác thực Private Chat trong Laravel Reverb
Để đảm bảo chỉ người dùng hợp lệ mới có thể lắng nghe và nhận tin nhắn trong Private Chat, Laravel sử dụng Private Channels kết hợp với cơ chế xác thực.
1. Xác thực Private Channel
Trong routes/channels.php:
🔹 Giải thích:
- Khi một người dùng cố gắng lắng nghe kênh
chat.{receiverId}, Laravel sẽ gọi callback xác thực. - Chỉ khi $user->id === $receiverId, Laravel mới cho phép người dùng lắng nghe kênh.
- Điều này đảm bảo chỉ người nhận tin nhắn mới có thể nghe tin nhắn đến.
2. Xác thực Người Dùng Trước Khi Gửi Tin Nhắn
Trong ChatController.php, Laravel bắt buộc user phải đăng nhập để gửi tin nhắn:
🔹 Giải thích:
Auth::id()lấy ID của user hiện tại (bắt buộc phải login).- Chặn gửi tin nhắn đến user không tồn tại với
exists:users,id. - Dữ liệu chỉ được lưu & phát đi nếu user hợp lệ.
3. Xác thực Khi Lắng Nghe Kênh Trên Frontend
Laravel Echo sẽ gửi request xác thực trước khi lắng nghe Private Channel.
Ví dụ, trong Vue.js/React/JavaScript:
📌 Lưu ý:
- Laravel sẽ tự động chặn kết nối nếu user không được phép nghe kênh
chat.{receiverId}. - Nếu user chưa đăng nhập, Laravel sẽ từ chối kết nối.
4. Laravel Xác Thực Private Channel Như Thế Nào?
Khi frontend yêu cầu lắng nghe một Private Channel, Laravel sẽ:
- Kiểm tra user đã đăng nhập hay chưa.
- Chạy callback trong
routes/channels.phpđể xem user có quyền nghe không. - Trả về lỗi nếu không hợp lệ, hoặc cho phép kết nối nếu hợp lệ.
📌 Tổng Kết
✅ Private Channel (chat.{receiverId}) đảm bảo chỉ người nhận mới được nghe tin nhắn.
✅ Laravel Echo gửi yêu cầu xác thực trước khi cho phép kết nối.
✅ Backend yêu cầu user phải đăng nhập khi gửi tin nhắn (Auth::id()).
✅ Nếu không xác thực, user không thể nhận tin nhắn private.
🔹 Với cách này, tin nhắn của user sẽ an toàn và không bị nghe lén. 🚀
No comments:
Post a Comment