Tech Verse Logo
Enable dark mode
Laravel ESL: Freeswitch Event Socket Layer integration with Laravel

Laravel ESL: Freeswitch Event Socket Layer integration with Laravel

Tech Verse Daily

Tech Verse Daily

4 min read

A Laravel package for connecting to and interacting with a FreeSWITCH ESL (Event Socket Library) server.

Features

  • Easy configuration for FreeSWITCH ESL connection details.

  • Fluent API for sending commands to FreeSWITCH.

  • Handles connection and authentication automatically.

  • Provides a Esl facade for convenient access.

  • Includes a custom exception for robust error handling.

  • Automatic resource management (disconnection).

Installation

You can install the package via Composer:

composer require kstmostofa/laravel-esl

The package will automatically register its service provider and facade.

Configuration

To publish the configuration file, run the following command:

php artisan vendor:publish --provider="Kstmostofa\LaravelEsl\LaravelEslServiceProvider"

This will create a config/esl.php file in your application's config directory. You can then configure your FreeSWITCH ESL connection details in your .env file:

ESL_HOST=127.0.0.1
ESL_PORT=8021
ESL_PASSWORD=ClueCon

Usage

You can interact with the FreeSWITCH ESL server in two primary ways:

Using the Esl Facade

The Esl facade provides a quick and easy way to send commands.

use Kstmostofa\LaravelEsl\Facades\Esl;
use Kstmostofa\LaravelEsl\EslConnectionException;

try {
    // Execute the 'status' command
    $response = Esl::execute('status');
    echo "FreeSWITCH Status:\n";
    print_r($response);

    // Originate a call
    $uuid = Esl::execute('originate user/1000 &echo');
    echo "Call UUID: " . $uuid;

} catch (EslConnectionException $e) {
    // Handle connection or authentication errors
    Log::error('ESL Connection failed: ' . $e->getMessage());
}

Using a Custom Connection

For situations where you need to connect to a different FreeSWITCH server on-the-fly, you can use the connection() method before executing a command. This will not affect the default connection configuration.

use Kstmostofa\LaravelEsl\Facades\Esl;
use Kstmostofa\LaravelEsl\EslConnectionException;

try {
    // Use the default connection from your config
    $defaultStatus = Esl::execute('status');

    // Connect to a different server for a specific command
    $customStatus = Esl::connection('10.0.1.5', 8021, 'another_password')
                       ->execute('status');

} catch (EslConnectionException $e) {
    Log::error('ESL command failed: ' . $e->getMessage());
}

Available Command Methods

The package provides the following helper methods for common API commands to make your code more readable.

// Get the server status
$status = Esl::status();

// Get a list of all active channels
$channels = Esl::showChannels();

// Get a list of all active calls
$calls = Esl::showCalls();

// Get the global sofia status
$sofiaStatus = Esl::sofiaStatus();

// Get the status of a specific sofia profile
$profileStatus = Esl::sofiaStatusProfile('internal');

For any command that does not have a dedicated helper method, you can use the execute() method directly:

// For example, to get the server uptime
$uptime = Esl::execute('uptime');

Using Dependency Injection

You can also type-hint the EslConnection class in your controllers or other classes to have it automatically injected by Laravel's service container.

use Kstmostofa\LaravelEsl\EslConnection;
use Kstmostofa\LaravelEsl\EslConnectionException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;

class CallController extends Controller
{
    private $esl;

    public function __construct(EslConnection $esl)
    {
        $this->esl = $esl;
    }

    public function makeCall(Request $request)
    {
        try {
            $destination = $request->input('destination', 'user/1001');
            $uuid = $this->esl->execute("originate sofia/gateway/my_gateway/{$destination} &echo");
            return response()->json(['message' => 'Call initiated.', 'uuid' => $uuid]);
        } catch (EslConnectionException $e) {
            Log::error('ESL command failed: ' . $e->getMessage());
            return response()->json(['error' => 'Failed to initiate call.'], 500);
        }
    }
}

Response Parsing

Currently, the execute method returns the raw response body from the FreeSWITCH API command. Future versions will include a more sophisticated parser to return structured data.

    Latest Posts

    View All

    React 19: What’s new in React 19

    React 19: What’s new in React 19

    Laravel Strict Validation: Enforcing Exact PHP Types

    Laravel Strict Validation: Enforcing Exact PHP Types

    Next.js 16.0.1: The Essential Update Developers Shouldn’t Skip

    Next.js 16.0.1: The Essential Update Developers Shouldn’t Skip

    Time Interval Helpers in Laravel 12.40

    Time Interval Helpers in Laravel 12.40

    From GitHub Actions to Production Rollout: CI/CD for Laravel

    From GitHub Actions to Production Rollout: CI/CD for Laravel

    Top React Libraries and Frameworks Every Frontend Developer Should Know

    Top React Libraries and Frameworks Every Frontend Developer Should Know

    PHP 8.5 New Features and Deprecations

    PHP 8.5 New Features and Deprecations

    Manage, Track and Monitor Queue Jobs in Laravel with Vantage

    Manage, Track and Monitor Queue Jobs in Laravel with Vantage

    Tinkerwell 5: Introducing Tinkerwell Intelligence

    Tinkerwell 5: Introducing Tinkerwell Intelligence

    Roach PHP - Complete Web Scraping toolkit for PHP

    Roach PHP - Complete Web Scraping toolkit for PHP