SymiddlewareExtension   A
last analyzed

Complexity

Total Complexity 3

Size/Duplication

Total Lines 36
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 16
c 1
b 0
f 0
dl 0
loc 36
rs 10
wmc 3

2 Methods

Rating   Name   Duplication   Size   Complexity  
A getAlias() 0 3 1
A load() 0 28 2
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