ContainerBuilderTransformer::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 3
cts 3
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
crap 1
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of Symplify.
7
 * Copyright (c) 2016 Tomas Votruba (http://tomasvotruba.cz).
8
 */
9
10
namespace Symplify\NetteAdapterForSymfonyBundles\Transformer;
11
12
use Nette\DI\ContainerBuilder as NetteContainerBuilder;
13
use Symfony\Component\DependencyInjection\ContainerBuilder as SymfonyContainerBuilder;
14
use Symplify\NetteAdapterForSymfonyBundles\Utils\Naming;
15
16
final class ContainerBuilderTransformer
17
{
18
    /**
19
     * @var ServiceDefinitionTransformer
20
     */
21
    private $serviceDefinitionTransformer;
22
23 7
    public function __construct(ServiceDefinitionTransformer $serviceDefinitionTransformer)
24
    {
25 7
        $this->serviceDefinitionTransformer = $serviceDefinitionTransformer;
26 7
    }
27
28 6
    public function transformFromNetteToSymfony(
29
        NetteContainerBuilder $netteContainerBuilder,
30
        SymfonyContainerBuilder $symfonyContainerBuilder
31
    ) {
32 6
        $netteServiceDefinitions = $netteContainerBuilder->getDefinitions();
33
34 6
        foreach ($netteServiceDefinitions as $name => $netteServiceDefinition) {
35 5
            $symfonyServiceDefinition = $this->serviceDefinitionTransformer->transformFromNetteToSymfony(
36
                $netteServiceDefinition
37
            );
38 5
            $symfonyContainerBuilder->setDefinition($name, $symfonyServiceDefinition);
39
        }
40 6
    }
41
42 6
    public function transformFromSymfonyToNette(
43
        SymfonyContainerBuilder $symfonyContainerBuilder,
44
        NetteContainerBuilder $netteContainerBuilder
45
    ) {
46 6
        $symfonyServiceDefinitions = $symfonyContainerBuilder->getDefinitions();
47
48 6
        foreach ($symfonyServiceDefinitions as $name => $symfonyServiceDefinition) {
49 6
            $name = Naming::sanitazeClassName((string) $name);
50 6
            if ($this->canServiceBeAdded($netteContainerBuilder, $name)) {
51 2
                $netteContainerBuilder->addDefinition(
52
                    $name,
53 6
                    $this->serviceDefinitionTransformer->transformFromSymfonyToNette($symfonyServiceDefinition)
54
                );
55
            }
56
        }
57
58 6
        $this->transformParametersFromSymfonyToNette($symfonyContainerBuilder, $netteContainerBuilder);
59 6
    }
60
61 6
    private function transformParametersFromSymfonyToNette(
62
        SymfonyContainerBuilder $symfonyContainerBuilder,
63
        NetteContainerBuilder $netteContainerBuilder
64
    ) {
65
        // transform parameters
66 6
        $parameterBag = $symfonyContainerBuilder->getParameterBag();
67 6
        foreach ($parameterBag->all() as $key => $value) {
68 2
            $netteContainerBuilder->parameters[$key] = $value;
69
        }
70 6
    }
71
72 6
    private function canServiceBeAdded(NetteContainerBuilder $netteContainerBuilder, string $name) : bool
73
    {
74 6
        $serviceNames = $this->getLowercasedNames($netteContainerBuilder);
75 6
        if (in_array($name, $serviceNames)) {
76 5
            return false;
77
        }
78
79 2
        return true;
80
    }
81
82
    /**
83
     * @return string[]
84
     */
85 6
    private function getLowercasedNames(NetteContainerBuilder $netteContainerBuilder) : array
86
    {
87 6
        $names = array_keys($netteContainerBuilder->getDefinitions());
88 6
        foreach ($names as $key => $name) {
89 6
            $names[$key] = strtolower((string) $name);
90
        }
91
92 6
        return $names;
93
    }
94
}
95