Completed
Pull Request — master (#34)
by Krzysztof
04:27
created

SearcherCompilerPass::processContext()   B

Complexity

Conditions 4
Paths 5

Size

Total Lines 38
Code Lines 24

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 18
CRAP Score 4

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 38
ccs 18
cts 18
cp 1
rs 8.5806
cc 4
eloc 24
nc 5
nop 3
crap 4
1
<?php
2
3
namespace KGzocha\Bundle\SearcherBundle\DependencyInjection\CompilerPass;
4
5
use KGzocha\Bundle\SearcherBundle\DependencyInjection\Configuration;
6
use Symfony\Component\DependencyInjection\ContainerBuilder;
7
use Symfony\Component\DependencyInjection\Definition;
8
9
/**
10
 * @author Krzysztof Gzocha <[email protected]>
11
 */
12
class SearcherCompilerPass extends AbstractCompilerPass
13
{
14
    /**
15
     * @var ParametersValidator
16
     */
17
    private $parametersValidator;
18
19
    /**
20
     * @param DefinitionBuilder   $definitionBuilder
21
     * @param string              $servicePrefix
22
     * @param ParametersValidator $parametersValidator
23
     */
24 9
    public function __construct(
25
        DefinitionBuilder $definitionBuilder,
26
        $servicePrefix,
27
        ParametersValidator $parametersValidator
28
    ) {
29 9
        parent::__construct($definitionBuilder, $servicePrefix);
30 9
        $this->parametersValidator = $parametersValidator;
31 9
    }
32
33
    /**
34
     * {@inheritdoc}
35
     */
36 8
    protected function processContext(
37
        $contextId,
38
        array &$context,
39
        ContainerBuilder $container
40
    ) {
41 8
        $config = $context[self::SEARCHER_PARAMETER];
42 8
        $this->parametersValidator->validateParameters($contextId, $config);
43
44 8
        if (isset($config[self::SERVICE_PARAMETER])) {
45 2
            return $this->createFromService($container, $contextId, $config);
46
        }
47
48 6
        $definition = new Definition($config[self::CLASS_PARAMETER]);
49 6
        if (Configuration::SEARCHER_CLASS == $config[self::CLASS_PARAMETER]) {
50
            $definition
51 4
                ->addArgument($container->getDefinition(
52 4
                    $this->buildServiceName($contextId, self::BUILDER_COLLECTION_PARAMETER)
53
                ))
54 4
                ->addArgument($container->getDefinition(
55 4
                    $this->buildServiceName($contextId, self::CONTEXT_PARAMETER)
56
                ));
57
        }
58
59 6
        if (isset($config[self::WRAPPER_CLASS_PARAMETER])) {
60 4
            $wrapperDefinition = new Definition($config[self::WRAPPER_CLASS_PARAMETER]);
61 4
            $wrapperDefinition->addArgument($definition);
62
63 4
            return $container->setDefinition(
64 4
                $this->buildServiceName($contextId, self::SEARCHER_PARAMETER),
65
                $wrapperDefinition
66
            );
67
        }
68
69 2
        return $container->setDefinition(
70 2
            $this->buildServiceName($contextId, self::SEARCHER_PARAMETER),
71
            $definition
72
        );
73
    }
74
75
    /**
76
     * @param ContainerBuilder $container
77
     * @param string           $contextId
78
     * @param array            $config
79
     *
80
     * @return Definition
81
     */
82 2
    private function createFromService(
83
        ContainerBuilder $container,
84
        $contextId,
85
        array &$config
86
    ) {
87 2
        $this->checkIfServiceExists(
88
            $container,
89
            $contextId,
90 2
            $config[self::SERVICE_PARAMETER]
91
        );
92
93 1
        if (isset($config[self::WRAPPER_CLASS_PARAMETER])) {
94 1
            $definition = new Definition($config[self::WRAPPER_CLASS_PARAMETER]);
95 1
            $definition->addArgument(
96 1
                $container->getDefinition($config[self::SERVICE_PARAMETER])
97
            );
98
99 1
            return $container->setDefinition(
100 1
                $this->buildServiceName($contextId, self::SEARCHER_PARAMETER),
101
                $definition
102
            );
103
        }
104
105
        return $container->setDefinition(
106
            $this->buildServiceName($contextId, self::SEARCHER_PARAMETER),
107
            $container->getDefinition($config[self::SERVICE_PARAMETER])
108
        );
109
    }
110
}
111