composer require tastyigniter/ti-ext-broadcast
php artisan vendor:publish --provider="TastyIgniter\Broadcast\BroadcastServiceProvider"
.env
BROADCAST_DRIVER=pusher # or 'redis', 'ably', etc.
MIX_PUSHER_APP_KEY=your_app_key
MIX_PUSHER_APP_CLUSTER=your_cluster
app/Events/OrderStatusUpdated.php):
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class OrderStatusUpdated implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $order;
public function __construct($order)
{
$this->order = $order;
}
public function broadcastOn()
{
return new Channel('orders.' . $this->order->id);
}
public function broadcastAs()
{
return 'order.status.updated';
}
}
use App\Events\OrderStatusUpdated;
// Inside a method (e.g., after updating order status)
event(new OrderStatusUpdated($order));
resources/js/app.js:
import Echo from 'laravel-echo';
window.Echo = new Echo({
broadcaster: 'pusher',
key: process.env.MIX_PUSHER_APP_KEY,
cluster: process.env.MIX_PUSHER_APP_CLUSTER,
forceTLS: true
});
Echo.channel('orders.123') // Replace with dynamic channel
.listen('order.status.updated', (data) => {
new Notification(`Order #${data.order.id} updated to ${data.order.status}`).show();
});
vendor/tastyigniter/ti-ext-broadcast/src/Events/ for TastyIgniter-specific event templates.config/ti-ext-broadcast.php for driver-specific settings (e.g., Redis queue, Pusher options).TastyIgniter\Broadcast\BroadcastServiceProvider for bootstrapping logic.Live Order Status Updates
Order model to dispatch OrderStatusUpdated on status changes.ShouldBroadcast interface for all events requiring real-time updates.class ReservationConfirmed implements ShouldBroadcast
{
use Dispatchable, SerializesModels;
public $reservation;
public function broadcastOn()
{
return new PrivateChannel('reservations.' . $this->reservation->user_id);
}
}
Event facade or Event::dispatch() for consistency.users.{user_id}.notifications) for scalability.public function broadcastOn()
{
return new Channel('users.' . auth()->id() . '.alerts');
}
public.notifications) to minimize unnecessary connections.// Subscribe only on the "Orders" page
if (window.location.pathname.includes('/orders')) {
Echo.join(`users.${userId}.orders`)
.here((users) => { /* Update UI */ })
.joining((user) => { /* Handle new user */ });
}
event(new OrderPlaced($order));
OrderNotification::dispatch($order)->delay(now()->addSeconds(5)); // Fallback email/SMS
Order, User) to auto-broadcast events.namespace App\Models;
use TastyIgniter\Broadcast\Traits\BroadcastsEvents;
class Order extends Model
{
use BroadcastsEvents;
protected $dispatchesEvents = [
'updated' => ['App\Events\OrderStatusUpdated'],
];
}
| Driver | Use Case | Configuration Tip |
|---|---|---|
| Pusher | Quick setup, managed service | Use BROADCAST_DRIVER=pusher in .env. |
| Redis | Self-hosted, cost-effective | Requires Redis server; use BROADCAST_DRIVER=redis. |
| Reverb | Laravel-native alternative to Pusher | Added in v4.0.5; configure via .env. |
| Ably | Global low-latency | Requires Ably account; set BROADCAST_DRIVER=ably. |
npm install --save laravel-echo pusher-js
workbox or Push.js.$event = new OrderPlaced($order);
$this->assertEquals('order.placed', $event->broadcastAs());
BroadcastServiceProvider to verify broadcasts.
$this->artisan('event:generate')
->expectsOutput('OrderPlaced')
->assertExitCode(0);
pusher-js or socket.io-client.Echo.leave(`users.${userId}.notifications`);
typing events) to reduce broadcast load.
let typingTimer;
Echo.channel('chat.room')
.listen('typing', () => {
clearTimeout(typingTimer);
typingTimer = setTimeout(() => { /* Handle */ }, 500);
});
window.Pusher or window.Echo initialization.resources/js/app.js includes:
import Pusher from 'pusher-js';
window.Pusher = Pusher;
Pusher errors (e.g., invalid APP_KEY)..env has:
SANCTUM_STATEFUL_DOMAINS=your-app.test
Echo.auth({
headers: { 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content }
});
.env has:
QUEUE_CONNECTION=redis
BROADCAST_CONNECTION=redis
Redis::connect() errors.ShouldBroadcast interface or incorrect broadcastOn().How can I help you explore Laravel packages today?