transformFromSymfonyToNette()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 8
ccs 4
cts 4
cp 1
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 4
nc 2
nop 1
crap 2
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 ReflectionClass;
14
use Symfony\Component\DependencyInjection\Definition;
15
use Symfony\Component\DependencyInjection\Reference;
16
use Symplify\NetteAdapterForSymfonyBundles\Utils\Naming;
17
18
final class ArgumentsTransformer
19
{
20
    /**
21
     * @var NetteContainerBuilder
22
     */
23
    private $netteContainerBuilder;
24
25
    /**
26
     * @var ServiceDefinitionTransformer
27
     */
28
    private $serviceDefinitionTransformer;
29
30 4
    public function setContainerBuilder(NetteContainerBuilder $netteContainerBuilder)
31
    {
32 4
        $this->netteContainerBuilder = $netteContainerBuilder;
33 4
    }
34
35 3
    public function transformFromSymfonyToNette(array $arguments) : array
36
    {
37 3
        foreach ($arguments as $key => $argument) {
38 3
            $arguments[$key] = $this->transformArgument($argument);
39
        }
40
41 3
        return $arguments;
42
    }
43
44
    /**
45
     * @param Reference|Definition|array $argument
46
     *
47
     * @return null|string
48
     */
49 3
    private function transformArgument($argument)
50
    {
51 3
        if ($argument instanceof Reference) {
52 3
            return $this->determineServiceName($argument);
53 2
        } elseif (is_array($argument)) {
54 2
            return $this->transformFromSymfonyToNette($argument);
55
        } elseif ($argument instanceof Definition) {
56 1
            $name = Naming::sanitazeClassName($argument->getClass());
57 1
            $netteServiceDefinition = $this->getServiceDefinitionTransformer()->transformFromSymfonyToNette(
58
                $argument
59
            );
60 1
            $this->netteContainerBuilder->addDefinition($name, $netteServiceDefinition);
61
62 1
            return '@' . $name;
63
        }
64
65 2
        return $argument;
66
    }
67
68 3
    private function determineServiceName(Reference $argument) : string
69
    {
70 3
        $name = (string) $argument;
71 3
        if ($name[0] === '@') {
72 1
            $className = (new ReflectionClass(substr($name, 1)))->getName();
0 ignored issues
show
Bug introduced by
Consider using (new \ReflectionClass(substr($name, 1)))->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
73 1
            $this->netteContainerBuilder->prepareClassList();
74 1
            $name = $this->netteContainerBuilder->getByType($className);
75
        }
76
77 3
        return '@' . $name;
78
    }
79
80 1
    private function getServiceDefinitionTransformer() : ServiceDefinitionTransformer
81
    {
82 1
        if ($this->serviceDefinitionTransformer === null) {
83 1
            $this->serviceDefinitionTransformer = new ServiceDefinitionTransformer($this);
84
        }
85
86 1
        return $this->serviceDefinitionTransformer;
87
    }
88
}
89