master

laravel/framework

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

BusServiceProvider.php

TLDR

The BusServiceProvider.php file in the Illuminate\Bus namespace is a service provider that registers various bus-related services in the Laravel framework. It defines the register() method for registering the services, the registerBatchServices() method for registering batch handling services, and the provides() method for specifying the provided services.

Methods

register

The register method registers the bus service provider. It creates a singleton instance of the Dispatcher class, by creating a new instance of the Dispatcher class with a closure. It also aliases the Dispatcher class with the DispatcherContract and QueueingDispatcherContract classes.

registerBatchServices

The registerBatchServices method registers the batch handling services. It creates singleton instances of the BatchRepository, DatabaseBatchRepository, and DynamoBatchRepository classes based on the queue.batching.driver configuration value. The DatabaseBatchRepository and DynamoBatchRepository classes are created with the necessary dependencies.

provides

The provides method returns an array of services provided by the BusServiceProvider. It includes the Dispatcher, DispatcherContract, QueueingDispatcherContract, BatchRepository, and DatabaseBatchRepository classes.

Classes

BusServiceProvider

The BusServiceProvider class is a service provider that registers various bus-related services in the Laravel framework. It extends the ServiceProvider class and implements the DeferrableProvider interface. It defines the register(), registerBatchServices(), and provides() methods.

<?php

namespace Illuminate\Bus;

use Aws\DynamoDb\DynamoDbClient;
use Illuminate\Contracts\Bus\Dispatcher as DispatcherContract;
use Illuminate\Contracts\Bus\QueueingDispatcher as QueueingDispatcherContract;
use Illuminate\Contracts\Queue\Factory as QueueFactoryContract;
use Illuminate\Contracts\Support\DeferrableProvider;
use Illuminate\Support\Arr;
use Illuminate\Support\ServiceProvider;

class BusServiceProvider extends ServiceProvider implements DeferrableProvider
{
    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton(Dispatcher::class, function ($app) {
            return new Dispatcher($app, function ($connection = null) use ($app) {
                return $app[QueueFactoryContract::class]->connection($connection);
            });
        });

        $this->registerBatchServices();

        $this->app->alias(
            Dispatcher::class, DispatcherContract::class
        );

        $this->app->alias(
            Dispatcher::class, QueueingDispatcherContract::class
        );
    }

    /**
     * Register the batch handling services.
     *
     * @return void
     */
    protected function registerBatchServices()
    {
        $this->app->singleton(BatchRepository::class, function ($app) {
            $driver = $app->config->get('queue.batching.driver', 'database');

            return $driver === 'dynamodb'
                ? $app->make(DynamoBatchRepository::class)
                : $app->make(DatabaseBatchRepository::class);
        });

        $this->app->singleton(DatabaseBatchRepository::class, function ($app) {
            return new DatabaseBatchRepository(
                $app->make(BatchFactory::class),
                $app->make('db')->connection($app->config->get('queue.batching.database')),
                $app->config->get('queue.batching.table', 'job_batches')
            );
        });

        $this->app->singleton(DynamoBatchRepository::class, function ($app) {
            $config = $app->config->get('queue.batching');

            $dynamoConfig = [
                'region' => $config['region'],
                'version' => 'latest',
                'endpoint' => $config['endpoint'] ?? null,
            ];

            if (! empty($config['key']) && ! empty($config['secret'])) {
                $dynamoConfig['credentials'] = Arr::only(
                    $config,
                    ['key', 'secret', 'token']
                );
            }

            return new DynamoBatchRepository(
                $app->make(BatchFactory::class),
                new DynamoDbClient($dynamoConfig),
                $app->config->get('app.name'),
                $app->config->get('queue.batching.table', 'job_batches'),
                ttl: $app->config->get('queue.batching.ttl', null),
                ttlAttribute: $app->config->get('queue.batching.ttl_attribute', 'ttl'),
            );
        });
    }

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return [
            Dispatcher::class,
            DispatcherContract::class,
            QueueingDispatcherContract::class,
            BatchRepository::class,
            DatabaseBatchRepository::class,
        ];
    }
}