ServiceDefinitionTransformer   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 86
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 13
lcom 1
cbo 4
dl 0
loc 86
ccs 40
cts 40
cp 1
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A transformFromSymfonyToNette() 0 15 2
A transformFromNetteToSymfony() 0 11 1
A transformTagsFromNetteToSymfony() 0 10 3
A transformFactoryFromSymfonyToNette() 0 21 4
A transformFactoryFromNetteToSymfony() 0 12 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\ServiceDefinition;
13
use Symfony\Component\DependencyInjection\Definition;
14
use Symfony\Component\DependencyInjection\Reference;
15
16
final class ServiceDefinitionTransformer
17
{
18
    /**
19
     * @var ArgumentsTransformer
20
     */
21
    private $argumentsTransformer;
22
23 8
    public function __construct(ArgumentsTransformer $argumentsTransformer)
24
    {
25 8
        $this->argumentsTransformer = $argumentsTransformer;
26 8
    }
27
28 2
    public function transformFromSymfonyToNette(Definition $symfonyDefinition)
29
    {
30 2
        $netteDefinition = (new ServiceDefinition())
31 2
            ->setClass($symfonyDefinition->getClass())
32 2
            ->setTags($symfonyDefinition->getTags());
33
34 2
        foreach ($symfonyDefinition->getMethodCalls() as $methodCall) {
35 2
            $methodCallArguments = $this->argumentsTransformer->transformFromSymfonyToNette($methodCall[1]);
36 2
            $netteDefinition->addSetup($methodCall[0], $methodCallArguments);
37
        }
38
39 2
        $netteDefinition = $this->transformFactoryFromSymfonyToNette($symfonyDefinition, $netteDefinition);
40
41 2
        return $netteDefinition;
42
    }
43
44 6
    public function transformFromNetteToSymfony(ServiceDefinition $netteDefinition)
45
    {
46 6
        $tags = $this->transformTagsFromNetteToSymfony($netteDefinition->getTags());
47 6
        $symfonyDefinition = (new Definition())
48 6
            ->setClass($netteDefinition->getClass())
49 6
            ->setTags($tags);
50
51 6
        $symfonyDefinition = $this->transformFactoryFromNetteToSymfony($netteDefinition, $symfonyDefinition);
52
53 6
        return $symfonyDefinition;
54
    }
55
56 6
    private function transformTagsFromNetteToSymfony(array $tags) : array
57
    {
58 6
        foreach ($tags as $key => $tag) {
59 2
            if (! is_array($tag)) {
60 2
                $tags[$key] = [[$tag]];
61
            }
62
        }
63
64 6
        return $tags;
65
    }
66
67 2
    private function transformFactoryFromSymfonyToNette(
68
        Definition $symfonyDefinition,
69
        ServiceDefinition $netteDefinition
70
    ) : ServiceDefinition {
71 2
        if ($factory = $symfonyDefinition->getFactory()) {
72 2
            if (is_array($factory) && $factory[0] instanceof Reference) {
73 1
                $serviceReference = $factory[0];
74 1
                $createMethod = $factory[1];
75
76
                // note: possible issue - static vs dynamic?
77 1
                $factory = ['@' . $serviceReference, $createMethod];
78
            }
79 2
            $netteDefinition->setFactory($factory);
80
        }
81
82 2
        $netteDefinition->setArguments(
83 2
            $this->argumentsTransformer->transformFromSymfonyToNette($symfonyDefinition->getArguments())
84
        );
85
86 2
        return $netteDefinition;
87
    }
88
89 6
    private function transformFactoryFromNetteToSymfony(
90
        ServiceDefinition $netteDefinition,
91
        Definition $symfonyDefinition
92
    ) : Definition {
93 6
        if ($netteDefinition->getFactory()) {
94 3
            $factory = $netteDefinition->getFactory();
95 3
            $symfonyDefinition->setFactory($factory->getEntity());
96 3
            $symfonyDefinition->setArguments($factory->arguments);
97
        }
98
99 6
        return $symfonyDefinition;
100
    }
101
}
102