SearcherCompilerPass::createFromService()   B
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 28
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 28
ccs 9
cts 9
cp 1
rs 8.8571
c 0
b 0
f 0
cc 2
eloc 18
nc 2
nop 3
crap 2
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 AbstractContextCompilerPass
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 10
    public function __construct(
25
        DefinitionBuilder $definitionBuilder,
26
        $servicePrefix,
27
        ParametersValidator $parametersValidator
28
    ) {
29 10
        parent::__construct($definitionBuilder, $servicePrefix);
30 10
        $this->parametersValidator = $parametersValidator;
31 10
    }
32
33
    /**
34
     * {@inheritdoc}
35
     */
36 9
    protected function processParam(
37
        $contextId,
38
        array &$paramConfig,
39
        ContainerBuilder $container
40
    ) {
41 9
        $config = $paramConfig[self::SEARCHER_PARAMETER];
42 9
        $this->parametersValidator->validateParameters($contextId, $config);
43
44 9
        if (isset($config[self::SERVICE_PARAMETER])) {
45 2
            return $this->createFromService($container, $contextId, $config);
46
        }
47
48 7
        $definition = new Definition($config[self::CLASS_PARAMETER]);
49 7
        $this->configureDefinition($definition, $container, $config, $contextId);
50 7
        $definition = $this->wrapDefinition($definition, $config);
51
52 7
        return $container->setDefinition(
53 7
            $this->buildServiceName($contextId, self::SEARCHER_PARAMETER),
54
            $definition
55
        );
56
    }
57
58
    /**
59
     * @param ContainerBuilder $container
60
     * @param string           $contextId
61
     * @param array            $config
62
     *
63
     * @return Definition
64
     */
65 2
    private function createFromService(
66
        ContainerBuilder $container,
67
        $contextId,
68
        array &$config
69
    ) {
70 2
        $this->checkIfServiceExists(
71
            $container,
72
            $contextId,
73 2
            $config[self::SERVICE_PARAMETER]
74
        );
75
76 1
        if (isset($config[self::WRAPPER_CLASS_PARAMETER])) {
77 1
            $definition = new Definition($config[self::WRAPPER_CLASS_PARAMETER]);
78 1
            $definition->addArgument(
79 1
                $container->getDefinition($config[self::SERVICE_PARAMETER])
80
            );
81
82 1
            return $container->setDefinition(
83 1
                $this->buildServiceName($contextId, self::SEARCHER_PARAMETER),
84
                $definition
85
            );
86
        }
87
88
        return $container->setDefinition(
89
            $this->buildServiceName($contextId, self::SEARCHER_PARAMETER),
90
            $container->getDefinition($config[self::SERVICE_PARAMETER])
91
        );
92
    }
93
94
    /**
95
     * @param Definition       $definition
96
     * @param ContainerBuilder $container
97
     * @param array            $config
98
     * @param string           $contextId
99
     *
100
     * @return void
101
     */
102 7
    private function configureDefinition(
103
        Definition $definition,
104
        ContainerBuilder $container,
105
        array &$config,
106
        $contextId
107
    ) {
108 7
        if (Configuration::SEARCHER_CLASS != $config[self::CLASS_PARAMETER]) {
109 2
            return;
110
        }
111
112
        $definition
113 5
            ->addArgument($container->getDefinition(
114 5
                $this->buildServiceName($contextId, self::BUILDER_COLLECTION_PARAMETER)
115
            ))
116 5
            ->addArgument($container->getDefinition(
117 5
                $this->buildServiceName($contextId, self::CONTEXT_PARAMETER)
118
            ));
119 5
    }
120
121
    /**
122
     * @param Definition       $definition
123
     * @param array            $config
124
     *
125
     * @return Definition
126
     */
127 7
    private function wrapDefinition(
128
        Definition $definition,
129
        array &$config
130
    ) {
131 7
        if (!isset($config[self::WRAPPER_CLASS_PARAMETER])) {
132 2
            return $definition;
133
        }
134
135 5
        $wrapperDefinition = new Definition($config[self::WRAPPER_CLASS_PARAMETER]);
136 5
        $wrapperDefinition->addArgument($definition);
137
138 5
        return $wrapperDefinition;
139
    }
140
}
141