Passed
Pull Request — master (#756)
by Maxim
07:24
created

QueueBootloader::initQueueConfig()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 17
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 1
eloc 11
nc 1
nop 1
dl 0
loc 17
ccs 3
cts 3
cp 1
crap 1
rs 9.9
c 2
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Spiral\Queue\Bootloader;
6
7
use Psr\Container\ContainerInterface;
8
use Spiral\Boot\AbstractKernel;
9
use Spiral\Boot\Bootloader\Bootloader;
10
use Spiral\Boot\EnvironmentInterface;
11
use Spiral\Config\ConfiguratorInterface;
12
use Spiral\Config\Patch\Append;
13
use Spiral\Core\Container;
14
use Spiral\Core\FactoryInterface;
15
use Spiral\Queue\Config\QueueConfig;
16
use Spiral\Queue\ContainerRegistry;
17
use Spiral\Queue\Core\QueueInjector;
18
use Spiral\Queue\DefaultSerializer;
19
use Spiral\Queue\Driver\NullDriver;
20
use Spiral\Queue\Driver\SyncDriver;
21
use Spiral\Queue\Failed\FailedJobHandlerInterface;
22
use Spiral\Queue\Failed\LogFailedJobHandler;
23
use Spiral\Queue\HandlerRegistryInterface;
24
use Spiral\Queue\QueueConnectionProviderInterface;
25
use Spiral\Queue\QueueInterface;
26
use Spiral\Queue\QueueManager;
27
use Spiral\Queue\QueueRegistry;
28
use Spiral\Queue\SerializerInterface;
29
30
final class QueueBootloader extends Bootloader
31
{
32
    protected const SINGLETONS = [
33
        HandlerRegistryInterface::class => QueueRegistry::class,
34
        FailedJobHandlerInterface::class => LogFailedJobHandler::class,
35
        QueueConnectionProviderInterface::class => QueueManager::class,
36
        QueueManager::class => [self::class, 'initQueueManager'],
37
        QueueRegistry::class => [self::class, 'initRegistry'],
38
    ];
39
40
    /** @var ConfiguratorInterface */
41
    private $config;
42
43 2
    public function __construct(ConfiguratorInterface $config)
44
    {
45 2
        $this->config = $config;
46
    }
47
48 2
    public function boot(Container $container, EnvironmentInterface $env, AbstractKernel $kernel): void
49
    {
50 2
        $this->initQueueConfig($env);
51 2
        $this->registerJobsSerializer($container);
52 2
        $this->registerQueue($container);
53
54 2
        $this->registerDriverAlias(SyncDriver::class, 'sync');
55 2
        $container->bindInjector(QueueInterface::class, QueueInjector::class);
56
57 2
        $kernel->started(static function () use ($container): void {
58 2
            $registry = $container->get(HandlerRegistryInterface::class);
59 2
            $config = $container->get(QueueConfig::class);
60
61 2
            foreach ($config->getRegistryHandlers() as $jobType => $handler) {
62
                $registry->setHandler($jobType, $handler);
63
            }
64
        });
65
    }
66
67 2
    public function registerDriverAlias(string $driverClass, string $alias): void
68
    {
69 2
        $this->config->modify(
70
            'queue',
71 2
            new Append('driverAliases', $alias, $driverClass)
72
        );
73
    }
74
75
    protected function initQueueManager(FactoryInterface $factory): QueueManager
76
    {
77
        return $factory->make(QueueManager::class);
78
    }
79
80 2
    protected function initRegistry(ContainerInterface $container, ContainerRegistry $registry)
81
    {
82 2
        return new QueueRegistry($container, $registry);
83
    }
84
85 2
    private function registerJobsSerializer(Container $container): void
86
    {
87 2
        $container->bindSingleton(SerializerInterface::class, static function () {
88
            return new DefaultSerializer();
89
        });
90
    }
91
92 2
    private function registerQueue(Container $container): void
93
    {
94 2
        $container->bindSingleton(
95
            QueueInterface::class,
96 2
            static function (QueueManager $manager): QueueInterface {
97
                return $manager->getConnection();
98
            }
99
        );
100
    }
101
102 2
    private function initQueueConfig(EnvironmentInterface $env): void
103
    {
104 2
        $this->config->setDefaults(
105
            QueueConfig::CONFIG,
106
            [
107 2
                'default' => $env->get('QUEUE_CONNECTION', 'sync'),
108
                'connections' => [
109
                    'sync' => [
110
                        'driver' => 'sync',
111
                    ],
112
                ],
113
                'registry' => [
114
                    'handlers' => [],
115
                ],
116
                'driverAliases' => [
117
                    'sync' => SyncDriver::class,
118
                    'null' => NullDriver::class,
119
                ],
120
            ]
121
        );
122
    }
123
}
124