Passed
Pull Request — master (#753)
by Maxim
07:31
created

QueueBootloader::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
c 1
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\Container\Autowire;
15
use Spiral\Core\FactoryInterface;
16
use Spiral\Queue\Config\QueueConfig;
17
use Spiral\Queue\ContainerRegistry;
18
use Spiral\Queue\Core\QueueInjector;
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
use Spiral\Queue\SerializerRegistry;
30
use Spiral\Queue\SerializerRegistryInterface;
31
32
final class QueueBootloader extends Bootloader
33
{
34
    protected const SINGLETONS = [
35
        HandlerRegistryInterface::class => QueueRegistry::class,
36
        FailedJobHandlerInterface::class => LogFailedJobHandler::class,
37
        QueueConnectionProviderInterface::class => QueueManager::class,
38
        SerializerRegistryInterface::class => SerializerRegistry::class,
39
        SerializerInterface::class => SerializerRegistryInterface::class,
40
        QueueManager::class => [self::class, 'initQueueManager'],
41
        QueueRegistry::class => [self::class, 'initRegistry'],
42
        SerializerRegistry::class => [self::class, 'initSerializerRegistry'],
43
    ];
44
45
    /** @var ConfiguratorInterface */
46
    private $config;
47
48 207
    public function __construct(ConfiguratorInterface $config)
49
    {
50 207
        $this->config = $config;
51
    }
52
53 207
    public function boot(Container $container, EnvironmentInterface $env, AbstractKernel $kernel): void
54
    {
55 207
        $this->initQueueConfig($env);
56 207
        $this->registerQueue($container);
57
58 207
        $this->registerDriverAlias(SyncDriver::class, 'sync');
59 207
        $container->bindInjector(QueueInterface::class, QueueInjector::class);
60
61 207
        $kernel->started(static function () use ($container): void {
62 207
            $registry = $container->get(HandlerRegistryInterface::class);
63 207
            $config = $container->get(QueueConfig::class);
64 207
            $serializersRegistry = $container->get(SerializerRegistryInterface::class);
65
66 207
            foreach ($config->getRegistryHandlers() as $jobType => $handler) {
67
                $registry->setHandler($jobType, $handler);
68
            }
69
70 207
            foreach ($config->getRegistrySerializers() as $jobType => $serializer) {
71
                if ($serializer instanceof Autowire || \is_string($serializer)) {
72
                    $serializer = $container->get($serializer);
73
                }
74
                $serializersRegistry->addSerializer($jobType, $serializer);
75
            }
76
        });
77
    }
78
79 207
    public function registerDriverAlias(string $driverClass, string $alias): void
80
    {
81 207
        $this->config->modify(
82
            QueueConfig::CONFIG,
83 207
            new Append('driverAliases', $alias, $driverClass)
84
        );
85
    }
86
87 2
    protected function initQueueManager(FactoryInterface $factory): QueueManager
88
    {
89 2
        return $factory->make(QueueManager::class);
90
    }
91
92 207
    protected function initRegistry(ContainerInterface $container, ContainerRegistry $registry)
93
    {
94 207
        return new QueueRegistry($container, $registry);
95
    }
96
97 207
    protected function initSerializerRegistry(Container $container, QueueConfig $config): SerializerRegistry
98
    {
99 207
        $default = $config->getDefaultSerializer();
100
101 207
        if ($default instanceof Autowire || \is_string($default)) {
102
            $default = $container->get($default);
103
        }
104
105 207
        return new SerializerRegistry($default);
106
    }
107
108 207
    private function registerQueue(Container $container): void
109
    {
110 207
        $container->bindSingleton(
111
            QueueInterface::class,
112 207
            static function (QueueManager $manager): QueueInterface {
113
                return $manager->getConnection();
114
            }
115
        );
116
    }
117
118 207
    private function initQueueConfig(EnvironmentInterface $env): void
119
    {
120 207
        $this->config->setDefaults(
121
            QueueConfig::CONFIG,
122
            [
123 207
                'default' => $env->get('QUEUE_CONNECTION', 'sync'),
124
                'connections' => [
125
                    'sync' => [
126
                        'driver' => 'sync',
127
                    ],
128
                ],
129
                'registry' => [
130
                    'handlers' => [],
131
                    'serializers' => [],
132
                ],
133
                'driverAliases' => [
134
                    'sync' => SyncDriver::class,
135
                    'null' => NullDriver::class,
136
                ],
137
            ]
138
        );
139
    }
140
}
141