This website is currently under active development (Beta) 🚀. Some features are still work in progress.
Laravel Tutorial

Mastering Laravel Echo: Build Real-time Applications with WebSockets

Admin User
Admin User
May 17, 2026
3 min read

Key Takeaways

  • # Mastering Laravel Echo: Build Real-time Applications with WebSockets
  • In today's dynamic web landscape, real-time features are no longer a luxury but an expec...

Mastering Laravel Echo: Build Real-time Applications with WebSockets

In today's dynamic web landscape, real-time features are no longer a luxury but an expectation. From live chat applications and instant notifications to interactive dashboards and collaborative tools, users demand immediate updates. This is where Laravel Echo comes into play. Laravel Echo is a powerful JavaScript library that makes it incredibly easy to integrate WebSockets into your Laravel application, allowing you to broadcast server-side events to your frontend with minimal effort.

This comprehensive tutorial will guide you through setting up Laravel Echo, broadcasting events from your backend, and listening to them in your frontend application, enabling you to build truly interactive experiences.

What is Laravel Echo? #

Laravel Echo is a client-side JavaScript library that subscribes to channels and listens for events broadcast by your Laravel application. It provides a clean, expressive API for handling WebSockets, abstracting away much of the complexity of raw WebSocket interactions. Echo works seamlessly with various broadcast drivers, including Pusher, Redis (via Laravel Websockets), and Ably, offering flexibility for your infrastructure choices.

Prerequisites #

Before we begin, ensure you have the following:

  • A working Laravel project (version 8.x or higher is recommended).
  • Composer installed globally.
  • Node.js and NPM/Yarn installed.
  • A basic understanding of Laravel events and JavaScript.

Step 1: Backend Setup - Laravel Broadcasting #

First, we need to configure our Laravel application to broadcast events.

1. Configure Broadcast Driver #

Open your .env file and set the BROADCAST_DRIVER to pusher (or redis if you're using Laravel Websockets). For this tutorial, we'll use Pusher as it's straightforward to set up.

BROADCAST_DRIVER=pusher

PUSHER_APP_ID="YOUR_APP_ID"
PUSHER_APP_KEY="YOUR_APP_KEY"
PUSHER_APP_SECRET="YOUR_APP_SECRET"
PUSHER_APP_CLUSTER="YOUR_APP_CLUSTER"

You'll need to create a free account on Pusher.com to get your application credentials.

Next, ensure the config/broadcasting.php file is configured correctly for Pusher:

// config/broadcasting.php

'connections' => [
    'pusher' => [
        'driver' => 'pusher',
        'key' => env('PUSHER_APP_KEY'),
        'secret' => env('PUSHER_APP_SECRET'),
        'app_id' => env('PUSHER_APP_ID'),
        'options' => [
            'cluster' => env('PUSHER_APP_CLUSTER'),
            'useTLS' => true,
        ],
    ],
    // ... other drivers
],

2. Install Pusher PHP SDK #

Install the Pusher PHP SDK via Composer:

composer require pusher/pusher-php-server "~7.0"

3. Uncomment Broadcast Service Provider #

In config/app.php, make sure the App\Providers\BroadcastServiceProvider::class is uncommented. This provider registers the broadcast routes and authorization callbacks.

// config/app.php

'providers' => [
    // ...
    App\Providers\BroadcastServiceProvider::class,
],

4. Create a Broadcast Event #

Let's create a simple event that will be broadcast. Imagine a NewMessage event for a chat application.

php artisan make:event NewMessage

Open app/Events/NewMessage.php and make it implement the ShouldBroadcast interface. Also, define the data and the channel it will broadcast on.

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class NewMessage implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $username;
    public $message;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($username, $message)
    {
        $this->username = $username;
        $this->message = $message;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new Channel('chat'); // Public channel
    }

    /**
     * The event's broadcast name.
     *
     * @return string
     */
    public function broadcastAs()
    {
        return 'message.new'; // Custom event name (optional)
    }

    /**
     * Get the data to broadcast.
     *
     * @return array
     */
    public function broadcastWith()
    {
        return [
            'username' => $this->username,
            'text' => $this->message,
            'timestamp' => now()->toDateTimeString(),
        ];
    }
}

Explanation:

  • ShouldBroadcast: This interface tells Laravel to broadcast the event.
  • __construct(): The data passed to the event will be made available to the broadcast.
  • broadcastOn(): Defines the channel(s) the event will be broadcast on. Here, new Channel('chat') creates a public channel.
  • broadcastAs(): (Optional) Allows you to customize the event name received by the client. If not specified, it defaults to the event's class name in kebab-case (e.g., new-message).
  • broadcastWith(): (Optional) Allows you to customize the payload sent with the event. If not specified, all public properties of the event are sent.

5. Dispatch the Event #

Now, you can dispatch this event from anywhere in your Laravel application (e.g., a controller, a job, or a service).

<?php

namespace App\Http\Controllers;

use App\Events\NewMessage;
use Illuminate\Http\Request;

class ChatController extends Controller
{
    public function sendMessage(Request $request)
    {
        $username = $request->input('username', 'Guest');
        $message = $request->input('message');

        event(new NewMessage($username, $message));

        return response()->json(['status' => 'Message sent!']);
    }
}

Don't forget to define a route for this controller method:

// routes/web.php

Route::post('/send-message', [ChatController::class, 'sendMessage']);

Step 2: Frontend Setup - Laravel Echo #

Now, let's configure your frontend to listen for these events.

1. Install Echo and Pusher JS #

Install Laravel Echo and its Pusher connector via NPM or Yarn:

npm install laravel-echo pusher-js
# OR
yarn add laravel-echo pusher-js

2. Initialize Echo #

In a typical Laravel setup with Vite or Webpack, you'll find resources/js/bootstrap.js. This is a good place to initialize Echo. If you're using a different frontend setup, ensure Pusher and Echo are globally available or imported where needed.

// resources/js/bootstrap.js

import Echo from 'laravel-echo';
import Pusher from 'pusher-js';

window.Pusher = Pusher;

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: import.meta.env.VITE_PUSHER_APP_KEY, // For Vite
    // key: process.env.MIX_PUSHER_APP_KEY, // For Webpack Mix
    cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER ?? 'mt1',
    forceTLS: true,
});

// Optional: Listen for connection status
window.Echo.connector.pusher.connection.bind('state_change', function(states) {
    console.log('Pusher connection state:', states.current);
});

Make sure your .env file contains the Pusher frontend keys (e.g., VITE_PUSHER_APP_KEY, VITE_PUSHER_APP_CLUSTER for Vite, or MIX_ prefix for Laravel Mix).

# For Vite (Laravel 9+)
VITE_PUSHER_APP_KEY=

FAQs

What is the difference between public, private, and presence channels in Laravel Echo?
Public channels are open to anyone without authentication. Private channels require authentication and authorization to subscribe to, ensuring only authorized users can listen. Presence channels are a special type of private channel that, in addition to authentication, provide real-time awareness of who is currently subscribed to the channel (e.g., for 'who's online' features).
Do I need a separate server for Laravel Echo and real-time features?
Yes, for actual real-time communication, you need a WebSocket server. Laravel Echo itself is a client-side library that connects to this server. Common choices include a hosted service like Pusher or Ably, or a self-hosted solution like Laravel Websockets (which uses Redis for broadcasting) that runs on your server.
Can I use Laravel Echo without Pusher?
Absolutely! While Pusher is a popular and easy-to-configure option, Laravel Echo supports other broadcast drivers. You can use Redis with the Laravel Websockets package for a self-hosted solution, or integrate with other services like Ably. You just need to change your `BROADCAST_DRIVER` in `.env` and configure Echo accordingly.

Want more content like this?

Explore more tutorials in the Laravel section.

Explore Laravel

You might also like