Completed
Pull Request — master (#24)
by
unknown
03:21
created

TacticianExtension::configureSecurity()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 14
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 2

Importance

Changes 2
Bugs 0 Features 1
Metric Value
c 2
b 0
f 1
dl 0
loc 14
ccs 12
cts 12
cp 1
rs 9.4285
cc 2
eloc 8
nc 2
nop 2
crap 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
     */
19 18
    protected function loadInternal(array $mergedConfig, ContainerBuilder $container)
20
    {
21 18
        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config/services'));
22 18
        $loader->load('services.yml');
23
24 18
        $this->configureCommandBuses($mergedConfig, $container);
25 18
        $this->injectMethodNameInflector($mergedConfig, $container);
26 18
        $this->configureSecurity($mergedConfig, $container);
27 18
    }
28
29 18
    public function getAlias()
30
    {
31 18
        return 'tactician';
32
    }
33
34
    /**
35
     * @param array $mergedConfig
36
     * @param ContainerBuilder $container
37
     */
38 18
    private function configureCommandBuses(array $mergedConfig, ContainerBuilder $container)
39
    {
40 18
        foreach ($mergedConfig['commandbus'] as $commandBusName => $commandBusConfig) {
41 18
            $middlewares = array_map(
42 18
                function ($middlewareServiceId) {
43 18
                    return new Reference($middlewareServiceId);
44 18
                },
45 18
                $commandBusConfig['middleware']
46 18
            );
47
48 18
            $serviceName = 'tactician.commandbus.' . $commandBusName;
49 18
            $definition = new Definition($container->getParameter('tactician.commandbus.class'), [$middlewares]);
50 18
            $container->setDefinition($serviceName, $definition);
51
52 18
            if ($commandBusName === $mergedConfig['default_bus']) {
53 18
                $container->setAlias('tactician.commandbus', $serviceName);
54 18
            }
55 18
        }
56 18
    }
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
     * @param ContainerBuilder $container
64
     */
65 18
    private function injectMethodNameInflector(array $mergedConfig, ContainerBuilder $container)
66
    {
67 18
        if (! $container->has('tactician.middleware.command_handler')) {
68
            return;
69
        }
70
71 18
        $inflectorReference = new Reference($mergedConfig['method_inflector']);
72
73 18
        $handlerLocator = $container->findDefinition('tactician.middleware.command_handler');
74 18
        $handlerLocator->replaceArgument(2, $inflectorReference);
75 18
    }
76
77
    /**
78
     * Configure the security voter.
79
     *
80
     * @param array $mergedConfig
81
     * @param ContainerBuilder $container
82
     */
83 18
    private function configureSecurity(array $mergedConfig, ContainerBuilder $container)
84
    {
85 18
        if (!$container->has('tactician.middleware.security_voter')) {
86 18
            $definition = new Definition(
87 18
                HandleCommandVoter::class,
88
                [
89 18
                    new Reference('security.access.decision_manager'),
90 18
                    $mergedConfig['security']
91 18
                ]
92 18
            );
93 18
            $definition->addTag('security.voter');
94 18
            $container->setDefinition('tactician.middleware.security_voter', $definition);
95 18
        }
96 18
    }
97
}
98