SymiddlewareExtension::load()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 28
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 15
c 1
b 0
f 0
nc 2
nop 2
dl 0
loc 28
rs 9.7666
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Kafkiansky\SymfonyMiddleware\DependencyInjection;
6
7
use Symfony\Component\Config\FileLocator;
8
use Symfony\Component\DependencyInjection\ContainerBuilder;
9
use Symfony\Component\DependencyInjection\Definition;
10
use Symfony\Component\DependencyInjection\Extension\Extension;
11
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
12
use Psr\Http\Server\MiddlewareInterface;
13
use Kafkiansky\SymfonyMiddleware\Middleware\Registry\MiddlewareRegistry;
14
use Kafkiansky\SymfonyMiddleware\Middleware\Registry\ServiceLocatorMiddlewareRegistry;
15
use function Symfony\Component\DependencyInjection\Loader\Configurator\service_locator;
16
17
final class SymiddlewareExtension extends Extension
18
{
19
    public function load(array $configs, ContainerBuilder $container): void
20
    {
21
        $container->registerForAutoconfiguration(MiddlewareInterface::class)
22
            ->addTag('kafkiansky.symfony.middleware');
23
24
        $loader = new PhpFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
25
        $loader->load('symiddleware.php');
26
27
        $configuration = $this->getConfiguration($configs, $container);
28
29
        if ($configuration === null) {
30
            return;
31
        }
32
33
        /** @var array{groups: array<string, array{if?: string}>} $config */
34
        $config = $this->processConfiguration($configuration, $configs);
35
36
        $config['groups']['global'] = [
37
            'if' => true, // global middleware should run always.
38
            'middlewares' => $config['global'] ?? [],
39
        ];
40
41
        unset($config['global']);
42
43
        // We will replace empty service locator in compiler pass when all middlewares will be found.
44
        $container->setDefinition(
45
            MiddlewareRegistry::class,
46
            new Definition(ServiceLocatorMiddlewareRegistry::class, [service_locator([]), $config['groups']])
47
        );
48
    }
49
50
    public function getAlias(): string
51
    {
52
        return 'symiddleware';
53
    }
54
}
55