Completed
Push — master ( 6adaed...dee3e4 )
by Vitaly
31:24 queued 21:19
created

XMLBuilder::buildXMLConfig()   C

Complexity

Conditions 9
Paths 25

Size

Total Lines 50
Code Lines 34

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 9
eloc 34
c 0
b 0
f 0
nc 25
nop 2
dl 0
loc 50
rs 6
1
<?php declare(strict_types = 1);
2
/**
3
 * Created by Vitaly Iegorov <[email protected]>.
4
 * on 26.08.16 at 09:42
5
 */
6
namespace samson\core;
7
8
use samsonframework\container\metadata\ClassMetadata;
9
10
/**
11
 * Class XMLBuilder
12
 *
13
 * @author Vitaly Egorov <[email protected]>
14
 */
15
class XMLBuilder
16
{
17
    /**
18
     * Set XML property or method argument value.
19
     *
20
     * @param string      $value
21
     * @param \DOMElement $node
22
     * @param ClassMetadata[]       $classesMetadata
23
     */
24
    protected function setAttribute(string $value, \DOMElement $node, array $classesMetadata)
25
    {
26
        if (array_key_exists($value, $classesMetadata)) {
27
            $node->setAttribute('service', $value);
28
        } elseif (class_exists($value)) {
29
            $node->setAttribute('class', $value);
30
        } else {
31
            $node->setAttribute('value', $value);
32
        }
33
    }
34
35
    /**
36
     * Build class xml config from class metadata.
37
     *
38
     * TODO: Scan for existing config and change only not filled values.
39
     *
40
     * @param ClassMetadata[] $classesMetadata
41
     * @param string        $path Path where to store XML files
42
     */
43
    public function buildXMLConfig(array $classesMetadata, string $path)
44
    {
45
        foreach ($classesMetadata as $alias => $classMetadata) {
46
            $dom = new \DOMDocument("1.0", "utf-8");
47
            $dom->preserveWhiteSpace = false;
48
            $dom->formatOutput = true;
49
            $root = $dom->createElement("dependencies");
50
            $dom->appendChild($root);
51
52
            // Build alias from class name if missing
53
            $alias = $alias ?? strtolower(str_replace('\\', '_', $classMetadata->className));
54
55
            $classData = $dom->createElement('instance');
56
            $classData->setAttribute('service', $alias);
57
            $classData->setAttribute('class', $classMetadata->className);
58
59
            foreach ($classMetadata->scopes as $scope) {
60
                $classData->setAttribute('scope', $scope);
61
            }
62
63
            $methodsData = $dom->createElement('methods');
64
            foreach ($classMetadata->methodsMetadata as $method => $methodMetadata) {
65
                if (count($methodMetadata->dependencies)) {
66
                    $methodData = $dom->createElement($method);
67
                    $argumentsData = $dom->createElement('arguments');
68
                    foreach ($methodMetadata->dependencies as $argument => $dependency) {
69
                        $argumentData = $dom->createElement($argument);
70
                        $this->setAttribute($dependency, $argumentData, $classesMetadata);
71
                        $argumentsData->appendChild($argumentData);
72
                    }
73
                    $methodData->appendChild($argumentsData);
74
                    $methodsData->appendChild($methodData);
75
                }
76
            }
77
            $classData->appendChild($methodsData);
78
79
            $propertiesData = $dom->createElement('properties');
80
            foreach ($classMetadata->propertiesMetadata as $property => $propertyMetadata) {
81
                if ($propertyMetadata->dependency !== null && $propertyMetadata->dependency !== '') {
82
                    $propertyData = $dom->createElement($property);
83
                    $this->setAttribute($propertyMetadata->dependency, $propertyData, $classesMetadata);
84
                    $propertiesData->appendChild($propertyData);
85
                }
86
            }
87
88
            $classData->appendChild($propertiesData);
89
            $root->appendChild($classData);
90
            $dom->save($path . $alias . '.xml');
91
        }
92
    }
93
}
94