Completed
Pull Request — master (#24)
by
unknown
05:06
created

TacticianExtension   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 87
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Test Coverage

Coverage 96.77%

Importance

Changes 4
Bugs 0 Features 1
Metric Value
wmc 9
c 4
b 0
f 1
lcom 1
cbo 6
dl 0
loc 87
ccs 30
cts 31
cp 0.9677
rs 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A loadInternal() 0 9 1
A getAlias() 0 4 1
A configureCommandBuses() 0 19 3
A injectMethodNameInflector() 0 11 2
A configureSecurity() 0 14 2
1
<?php namespace League\Tactician\Bundle\DependencyInjection;
2
3
use League\Tactician\Bundle\Security\Voter\HandleCommandVoter;
4
use Symfony\Component\Config\FileLocator;
5
use Symfony\Component\DependencyInjection\ContainerBuilder;
6
use Symfony\Component\DependencyInjection\Definition;
7
use Symfony\Component\DependencyInjection\Loader;
8
use Symfony\Component\DependencyInjection\Reference;
9
use Symfony\Component\HttpKernel\DependencyInjection\ConfigurableExtension;
10
11
class TacticianExtension extends ConfigurableExtension
12
{
13
    /**
14
     * Configures the passed container according to the merged configuration.
15
     *
16
     * @param array $mergedConfig
17
     * @param ContainerBuilder $container
18 15
     */
19
    protected function loadInternal(array $mergedConfig, ContainerBuilder $container)
20 15
    {
21 15
        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config/services'));
22
        $loader->load('services.yml');
23 15
24 15
        $this->configureCommandBuses($mergedConfig, $container);
25 15
        $this->injectMethodNameInflector($mergedConfig, $container);
26
        $this->configureSecurity($mergedConfig, $container);
27 15
    }
28
29 15
    public function getAlias()
30
    {
31
        return 'tactician';
32
    }
33
34
    /**
35
     * @param array $mergedConfig
36 15
     * @param ContainerBuilder $container
37
     */
38 15
    private function configureCommandBuses(array $mergedConfig, ContainerBuilder $container)
39 15
    {
40 15
        foreach ($mergedConfig['commandbus'] as $commandBusName => $commandBusConfig) {
41 15
            $middlewares = array_map(
42 15
                function ($middlewareServiceId) {
43 15
                    return new Reference($middlewareServiceId);
44 15
                },
45
                $commandBusConfig['middleware']
46 15
            );
47 15
48 15
            $serviceName = 'tactician.commandbus.' . $commandBusName;
49
            $definition = new Definition($container->getParameter('tactician.commandbus.class'), [$middlewares]);
50 15
            $container->setDefinition($serviceName, $definition);
51 15
52 15
            if ($commandBusName === $mergedConfig['default_bus']) {
53 15
                $container->setAlias('tactician.commandbus', $serviceName);
54 15
            }
55
        }
56
    }
57
58
    /**
59
     * Define the default Method Name Inflector.
60
     * This will fail silently if the command_handler service does not exist
61
     *
62
     * @param array $mergedConfig
63 15
     * @param ContainerBuilder $container
64
     */
65 15
    private function injectMethodNameInflector(array $mergedConfig, ContainerBuilder $container)
66
    {
67
        if (! $container->has('tactician.middleware.command_handler')) {
68
            return;
69 15
        }
70
71 15
        $inflectorReference = new Reference($mergedConfig['method_inflector']);
72 15
73 15
        $handlerLocator = $container->findDefinition('tactician.middleware.command_handler');
74
        $handlerLocator->replaceArgument(2, $inflectorReference);
75
    }
76
77
    /**
78
     * Configure the security voter.
79
     *
80
     * @param array $mergedConfig
81
     * @param ContainerBuilder $container
82
     */
83
    private function configureSecurity(array $mergedConfig, ContainerBuilder $container)
84
    {
85
        if (!$container->has('tactician.middleware.security_voter')) {
86
            $definition = new Definition(
87
                HandleCommandVoter::class,
88
                [
89
                    new Reference('security.access.decision_manager'),
90
                    $mergedConfig['security']
91
                ]
92
            );
93
            $definition->addTag('security.voter');
94
            $container->setDefinition('tactician.middleware.security_voter', $definition);
95
        }
96
    }
97
}
98