Completed
Pull Request — master (#34)
by Krzysztof
06:00 queued 45s
created

CriteriaCompilerPass   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 82
Duplicated Lines 47.56 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 5
c 1
b 0
f 0
lcom 1
cbo 4
dl 39
loc 82
ccs 23
cts 23
cp 1
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A processContext() 0 18 2
A processCriteria() 15 15 1
B buildDefinition() 24 24 2

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
3
namespace KGzocha\Bundle\SearcherBundle\DependencyInjection\CompilerPass;
4
5
use Symfony\Component\Config\Definition\Exception\InvalidDefinitionException;
6
use Symfony\Component\DependencyInjection\ContainerBuilder;
7
use Symfony\Component\DependencyInjection\Definition;
8
use Symfony\Component\DependencyInjection\Reference;
9
10
/**
11
 * @author Krzysztof Gzocha <[email protected]>
12
 */
13
class CriteriaCompilerPass extends AbstractCompilerPass
14
{
15
    /**
16
     * {@inheritdoc}
17
     */
18 2
    protected function processContext(
19
        $contextId,
20
        array &$context,
21
        ContainerBuilder $container
22
    ) {
23 2
        foreach ($context[self::CRITERIA_PARAMETER] as &$criteria) {
24 2
            $definitionName = $this->processCriteria($contextId, $criteria, $container);
25
26
            $criteriaCollection = $this
27 2
                ->buildServiceName($contextId, self::CRITERIA_COLLECTION_PARAMETER);
28
            $container
29 2
                ->getDefinition($criteriaCollection)
30 2
                ->addMethodCall(
31 2
                    'addNamedCriteria',
32 2
                    [$criteria[self::NAME_PARAMETER], new Reference($definitionName)]
33
                );
34
        }
35 2
    }
36
37
    /**
38
     * @param string           $contextId
39
     * @param array            $criteria
40
     * @param ContainerBuilder $container
41
     *
42
     * @return string
43
     *
44
     * @throws InvalidDefinitionException
45
     */
46 2 View Code Duplication
    private function processCriteria(
47
        $contextId,
48
        array &$criteria,
49
        ContainerBuilder $container
50
    ) {
51 2
        $this->validateParameters($contextId, $criteria);
52 2
        $definitionName = $this->buildServiceName(
53
            $contextId,
54 2
            sprintf('%s.%s', self::CRITERIA_PARAMETER, $criteria[self::NAME_PARAMETER])
55
        );
56
57 2
        $this->buildDefinition($container, $contextId, $definitionName, $criteria);
58
59 2
        return $definitionName;
60
    }
61
62
    /**
63
     * @param ContainerBuilder $container
64
     * @param string           $contextId
65
     * @param string           $definitionName
66
     * @param array            $criteria
67
     *
68
     * @return Definition
69
     */
70 2 View Code Duplication
    private function buildDefinition(
71
        ContainerBuilder $container,
72
        $contextId,
73
        $definitionName,
74
        array &$criteria
75
    ) {
76 2
        if (isset($criteria[self::SERVICE_PARAMETER])) {
77 1
            $this->checkIfServiceExists(
78
                $container,
79
                $contextId,
80 1
                $criteria[self::SERVICE_PARAMETER]
81
            );
82
83 1
            return $container->setDefinition(
84
                $definitionName,
85 1
                $container->getDefinition($criteria[self::SERVICE_PARAMETER])
86
            );
87
        }
88
89 2
        return $container->setDefinition(
90
            $definitionName,
91 2
            new Definition($criteria[self::CLASS_PARAMETER])
92
        );
93
    }
94
}
95