muba00 / laravel-live-chat
A Laravel package that adds real time live chat functionality to your application.
Fund package maintenance!
muba00
Installs: 1
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/muba00/laravel-live-chat
Requires
- php: ^8.3
- illuminate/contracts: ^11.0||^12.0
- spatie/laravel-package-tools: ^1.16
Requires (Dev)
- larastan/larastan: ^3.0
- laravel/pint: ^1.14
- nunomaduro/collision: ^8.8
- orchestra/testbench: ^10.0.0||^9.0.0
- pestphp/pest: ^4.0
- pestphp/pest-plugin-arch: ^4.0
- pestphp/pest-plugin-laravel: ^4.0
- phpstan/extension-installer: ^1.4
- phpstan/phpstan-deprecation-rules: ^2.0
- phpstan/phpstan-phpunit: ^2.0
- spatie/laravel-ray: ^1.35
README
A simple, elegant Laravel package that adds real-time 1-to-1 chat functionality to your application using Laravel Reverb. Easy to install, easy to use, and follows Laravel best practices.
โจ Features
- ๐ Real-time messaging using Laravel Reverb WebSockets
- ๐ฌ 1-to-1 conversations between users
- โ Read receipts to track message status
- โ๏ธ Typing indicators for better UX
- ๐ Built-in authorization policies
- ๏ธ Highly configurable with sensible defaults
- ๐งช Thoroughly tested with 100+ tests
- ๐ฆ Easy to remove - clean uninstall with no residual code
๐จ Frontend Components Coming Soon! Complete React, Vue 3, and Livewire UI components are currently in development. For now, you can use the backend API to build your own custom frontend.
๐ Requirements
- PHP 8.3+
- Laravel 11.0+
- Laravel Reverb (for real-time features)
- Laravel Sanctum (for API authentication)
๐ Quick Start
1. Install the Package
composer require muba00/laravel-live-chat
2. Run the Installer
php artisan live-chat:install
This interactive command will:
- Check prerequisites
- Publish configuration files
- Publish and run migrations
- Guide you through additional setup steps
3. Configure Broadcasting
Install Laravel Reverb:
composer require laravel/reverb php artisan reverb:install
4. Configure Authentication
If not already done, install Laravel Sanctum:
composer require laravel/sanctum php artisan install:api
5. Install Frontend Dependencies
npm install --save-dev laravel-echo pusher-js npm run build
6. Start Using the Chat!
Backend - Create a conversation and send a message:
use muba00\LaravelLiveChat\Models\Conversation; use muba00\LaravelLiveChat\Models\Message; // Get or create a conversation between two users $conversation = Conversation::between(auth()->user(), $otherUser); // Send a message $message = Message::create([ 'conversation_id' => $conversation->id, 'sender_id' => auth()->id(), 'message' => 'Hello! How are you?', ]);
Frontend - Build your own custom UI:
Use the provided API endpoints to build your custom chat interface. Complete frontend components for React, Vue 3, and Livewire are coming soon!
๐ Documentation
Installation
Manual Installation (Alternative)
If you prefer to install manually instead of using the installer command:
# Install package composer require muba00/laravel-live-chat # Publish config php artisan vendor:publish --tag="laravel-live-chat-config" # Publish migrations php artisan vendor:publish --tag="laravel-live-chat-migrations" # Run migrations php artisan migrate
Configuration
The package configuration file is published to config/live-chat.php. Here are the key configuration options:
return [ // User model configuration 'user_model' => 'App\\Models\\User', // Customize table names 'tables' => [ 'conversations' => 'live_chat_conversations', 'messages' => 'live_chat_messages', ], // API routes configuration 'routes' => [ 'enabled' => true, 'prefix' => 'chat/api', 'middleware' => ['api', 'auth:sanctum'], ], // Broadcasting settings 'broadcasting' => [ 'enabled' => true, 'channel_prefix' => 'chat', ], // Pagination 'pagination' => [ 'messages_per_page' => 50, 'conversations_per_page' => 20, ], // Message retention and storage 'storage' => [ 'retention_days' => null, // null = keep forever 'archive_enabled' => false, 'max_message_length' => 5000, ], // Feature toggles 'features' => [ 'read_receipts' => true, 'typing_indicators' => true, ], // Security settings 'security' => [ 'sanitize_messages' => true, 'max_conversations_per_user' => 100, ], ];
Environment Variables
You can override configuration using environment variables:
CHAT_USER_MODEL="App\Models\User" CHAT_MESSAGES_PER_PAGE=50 CHAT_CONVERSATIONS_PER_PAGE=20 CHAT_RETENTION_DAYS=90 CHAT_CACHE_ENABLED=true CHAT_CACHE_TTL=3600
Usage
Backend API
The package automatically registers RESTful API routes:
POST /chat/api/conversations # Create/get conversation
GET /chat/api/conversations # List user's conversations
GET /chat/api/conversations/{id} # Get conversation details
DELETE /chat/api/conversations/{id} # Delete conversation
GET /chat/api/conversations/{id}/messages # Get messages
POST /chat/api/conversations/{id}/messages # Send message
POST /chat/api/conversations/{id}/messages/mark-read # Mark messages as read
GET /chat/api/conversations/{id}/messages/unread-count # Get unread count
POST /chat/api/conversations/{id}/typing # Broadcast typing indicator
Using Models
use muba00\LaravelLiveChat\Models\Conversation; use muba00\LaravelLiveChat\Models\Message; // Get or create a conversation $conversation = Conversation::between($user1, $user2); // Check if a user is part of a conversation $conversation->includesUser($user); // Get the other user in a conversation $otherUser = $conversation->getOtherUser(auth()->user()); // Send a message $message = Message::create([ 'conversation_id' => $conversation->id, 'sender_id' => auth()->id(), 'message' => 'Hello!', ]); // Mark messages as read $conversation->markAsReadBy(auth()->user()); // Get unread message count $unreadCount = $conversation->unreadMessagesFor(auth()->user())->count();
Frontend Integration
The package provides a RESTful API for building custom chat interfaces. Complete frontend components for React, Vue 3, and Livewire are currently in development.
Example API Usage
// Fetch conversations const response = await fetch("/chat/api/conversations", { headers: { Authorization: `Bearer ${token}`, Accept: "application/json", }, }); const conversations = await response.json(); // Send a message await fetch(`/chat/api/conversations/${conversationId}/messages`, { method: "POST", headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json", Accept: "application/json", }, body: JSON.stringify({ message: "Hello!" }), }); // Listen for real-time messages Echo.private(`chat.${conversationId}`).listen("MessageSent", (event) => { console.log("New message:", event.message); });
Broadcasting Setup
Configure Laravel Reverb
Add to your .env:
BROADCAST_CONNECTION=reverb REVERB_APP_ID=your-app-id REVERB_APP_KEY=your-app-key REVERB_APP_SECRET=your-app-secret REVERB_HOST="localhost" REVERB_PORT=8080 REVERB_SCHEME=http
Setup Laravel Echo
In your resources/js/bootstrap.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 ?? 80, wssPort: import.meta.env.VITE_REVERB_PORT ?? 443, forceTLS: (import.meta.env.VITE_REVERB_SCHEME ?? "https") === "https", enabledTransports: ["ws", "wss"], });
Start Reverb Server
php artisan reverb:start
For production, use a process manager like Supervisor.
Artisan Commands
Install Command
php artisan live-chat:install [options] Options: --force Overwrite existing files --skip-migrations Skip publishing migrations --skip-config Skip publishing config
Cleanup Command
php artisan live-chat:cleanup [options] Options: --days=X Number of days to retain (overrides config) --archive Archive messages instead of deleting --dry-run Show what would be deleted without deleting --force Skip confirmation prompt
Schedule cleanup automatically:
// In app/Console/Kernel.php protected function schedule(Schedule $schedule) { // Clean up messages older than 90 days, daily at 2 AM $schedule->command('live-chat:cleanup --days=90 --force') ->dailyAt('02:00'); }
Security
The package includes built-in authorization:
- Users can only access conversations they're part of
- Messages are validated before storage
- XSS protection via message sanitization
- Rate limiting support
- Private broadcast channels with authorization
Customization
Customize Models
You can extend the package models in your application:
namespace App\Models; use muba00\LaravelLiveChat\Models\Conversation as BaseConversation; class Conversation extends BaseConversation { // Add your custom methods and properties }
Then update your config to use your custom model.
Disable Auto-registered Routes
// In config/live-chat.php 'routes' => [ 'enabled' => false, ],
Then register routes manually in your routes/api.php.
๐งช Testing
composer test
composer test-coverage
composer analyse
composer format
๐๏ธ Uninstalling
# Rollback migrations php artisan migrate:rollback # Remove published assets (optional) rm config/live-chat.php # Remove package composer remove muba00/laravel-live-chat
๐ Additional Resources
๐ Troubleshooting
Messages not appearing in real-time
- Check Reverb is running:
php artisan reverb:start - Verify
.envconfiguration for Reverb - Check browser console for WebSocket errors
- Ensure Laravel Echo is properly initialized
Authorization errors
- Verify Sanctum is installed and configured
- Check API token is being sent in requests
- Ensure user is part of the conversation
Database errors
- Run migrations:
php artisan migrate - Check table names in config match your setup
- Verify user model configuration
๐ค Contributing
Please see CONTRIBUTING for details.
๐ Security Vulnerabilities
Please review our security policy on how to report security vulnerabilities.
๐ Changelog
Please see CHANGELOG for more information on what has changed recently.
๐ Credits
๐ License
The MIT License (MIT). Please see License File for more information.