master

laravel/framework

Last updated at: 29/12/2023 09:24

Connection.php

TLDR

The Connection.php file in the Illuminate\Redis\Connections namespace is an abstract class that serves as a base class for Redis connection implementations in the Laravel framework. It provides common functionality for Redis connections and defines abstract methods that must be implemented by concrete connection classes.

Methods

createSubscription

This is an abstract method that accepts a set of channels, a callback function, and a method parameter. It is responsible for subscribing to the given channels for messages. This method must be implemented by concrete connection classes.

funnel

This method accepts a name parameter and returns a ConcurrencyLimiterBuilder instance. It allows you to funnel a callback for a maximum number of simultaneous executions.

throttle

This method accepts a name parameter and returns a DurationLimiterBuilder instance. It allows you to throttle a callback for a maximum number of executions over a given duration.

client

This method returns the underlying Redis client instance.

subscribe

This method is responsible for subscribing to a set of given channels for messages. It accepts channels and a callback function as parameters.

psubscribe

This method is responsible for subscribing to a set of given channels with wildcards. It accepts channels and a callback function as parameters.

command

This method allows you to run a command against the Redis database. It accepts a method name and an optional array of parameters. It also measures the execution time of the command and dispatches a CommandExecuted event if an event dispatcher is set.

parseParametersForEvent

This protected method is responsible for parsing the command's parameters for event dispatching. It accepts an array of parameters and returns an array.

event

This protected method is responsible for firing the given event if possible. It accepts an event instance as a parameter.

listen

This method allows you to register a Redis command listener with the connection. It accepts a callback function as a parameter.

getName

This method returns the connection name.

setName

This method allows you to set the connection name. It accepts a name parameter and returns the connection instance.

getEventDispatcher

This method returns the event dispatcher used by the connection.

setEventDispatcher

This method allows you to set the event dispatcher instance on the connection. It accepts an event dispatcher as a parameter.

unsetEventDispatcher

This method is responsible for unsetting the event dispatcher instance on the connection.

__call

This magic method is responsible for passing other method calls down to the underlying Redis client. It allows you to make Redis commands by simply calling them as methods on the connection instance.

Classes

None

<?php

namespace Illuminate\Redis\Connections;

use Closure;
use Illuminate\Contracts\Events\Dispatcher;
use Illuminate\Redis\Events\CommandExecuted;
use Illuminate\Redis\Limiters\ConcurrencyLimiterBuilder;
use Illuminate\Redis\Limiters\DurationLimiterBuilder;
use Illuminate\Support\Traits\Macroable;

abstract class Connection
{
    use Macroable {
        __call as macroCall;
    }

    /**
     * The Redis client.
     *
     * @var \Redis
     */
    protected $client;

    /**
     * The Redis connection name.
     *
     * @var string|null
     */
    protected $name;

    /**
     * The event dispatcher instance.
     *
     * @var \Illuminate\Contracts\Events\Dispatcher
     */
    protected $events;

    /**
     * Subscribe to a set of given channels for messages.
     *
     * @param  array|string  $channels
     * @param  \Closure  $callback
     * @param  string  $method
     * @return void
     */
    abstract public function createSubscription($channels, Closure $callback, $method = 'subscribe');

    /**
     * Funnel a callback for a maximum number of simultaneous executions.
     *
     * @param  string  $name
     * @return \Illuminate\Redis\Limiters\ConcurrencyLimiterBuilder
     */
    public function funnel($name)
    {
        return new ConcurrencyLimiterBuilder($this, $name);
    }

    /**
     * Throttle a callback for a maximum number of executions over a given duration.
     *
     * @param  string  $name
     * @return \Illuminate\Redis\Limiters\DurationLimiterBuilder
     */
    public function throttle($name)
    {
        return new DurationLimiterBuilder($this, $name);
    }

    /**
     * Get the underlying Redis client.
     *
     * @return mixed
     */
    public function client()
    {
        return $this->client;
    }

    /**
     * Subscribe to a set of given channels for messages.
     *
     * @param  array|string  $channels
     * @param  \Closure  $callback
     * @return void
     */
    public function subscribe($channels, Closure $callback)
    {
        return $this->createSubscription($channels, $callback, __FUNCTION__);
    }

    /**
     * Subscribe to a set of given channels with wildcards.
     *
     * @param  array|string  $channels
     * @param  \Closure  $callback
     * @return void
     */
    public function psubscribe($channels, Closure $callback)
    {
        return $this->createSubscription($channels, $callback, __FUNCTION__);
    }

    /**
     * Run a command against the Redis database.
     *
     * @param  string  $method
     * @param  array  $parameters
     * @return mixed
     */
    public function command($method, array $parameters = [])
    {
        $start = microtime(true);

        $result = $this->client->{$method}(...$parameters);

        $time = round((microtime(true) - $start) * 1000, 2);

        if (isset($this->events)) {
            $this->event(new CommandExecuted(
                $method, $this->parseParametersForEvent($parameters), $time, $this
            ));
        }

        return $result;
    }

    /**
     * Parse the command's parameters for event dispatching.
     *
     * @param  array  $parameters
     * @return array
     */
    protected function parseParametersForEvent(array $parameters)
    {
        return $parameters;
    }

    /**
     * Fire the given event if possible.
     *
     * @param  mixed  $event
     * @return void
     */
    protected function event($event)
    {
        $this->events?->dispatch($event);
    }

    /**
     * Register a Redis command listener with the connection.
     *
     * @param  \Closure  $callback
     * @return void
     */
    public function listen(Closure $callback)
    {
        $this->events?->listen(CommandExecuted::class, $callback);
    }

    /**
     * Get the connection name.
     *
     * @return string|null
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set the connections name.
     *
     * @param  string  $name
     * @return $this
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get the event dispatcher used by the connection.
     *
     * @return \Illuminate\Contracts\Events\Dispatcher
     */
    public function getEventDispatcher()
    {
        return $this->events;
    }

    /**
     * Set the event dispatcher instance on the connection.
     *
     * @param  \Illuminate\Contracts\Events\Dispatcher  $events
     * @return void
     */
    public function setEventDispatcher(Dispatcher $events)
    {
        $this->events = $events;
    }

    /**
     * Unset the event dispatcher instance on the connection.
     *
     * @return void
     */
    public function unsetEventDispatcher()
    {
        $this->events = null;
    }

    /**
     * Pass other method calls down to the underlying client.
     *
     * @param  string  $method
     * @param  array  $parameters
     * @return mixed
     */
    public function __call($method, $parameters)
    {
        if (static::hasMacro($method)) {
            return $this->macroCall($method, $parameters);
        }

        return $this->command($method, $parameters);
    }
}