Completed
Push — master ( afbab4...927ca3 )
by Vitaly
10:31
created

Container::getClassName()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 3

Importance

Changes 4
Bugs 0 Features 1
Metric Value
c 4
b 0
f 1
dl 0
loc 7
ccs 5
cts 5
cp 1
rs 9.4285
cc 3
eloc 5
nc 4
nop 1
crap 3
1
<?php
2
/**
3
 * Created by Vitaly Iegorov <[email protected]>.
4
 * on 26.01.16 at 15:11
5
 */
6
namespace samsonframework\di;
7
8
use samsonframework\di\exception\ContainerException;
9
10
class Container extends AbstractContainer
11
{
12
    /** Variable name for storing services */
13
    const STATIC_COLLECTION_VARIABLE = '$services';
14
15
    /** @var array[string] Collection of loaded services */
16
    protected $services = array();
17
18
    /**
19
     * Set service dependency. Upon first creation of this class instance
20
     * it would be used everywhere where this dependency is needed.
21
     *
22
     * @param string $className  Fully qualified class name
23
     * @param array  $parameters Collection of parameters needed for dependency creation
24
     * @param string $alias      Dependency name
25
     *
26
     * @return $this Chaining
27
     */
28 6
    public function service($className, array $parameters, $alias = null)
29
    {
30 6
        $this->services[$className] = $className;
31 6
32 6
        return $this->set($className, $parameters, $alias);
33 6
    }
34
35
    /**
36
     * {@inheritdoc}
37
     */
38
    public function set($className, array $parameters, $alias = null)
39
    {
40
        // Merge other class constructor parameters
41
        $this->dependencies[$className] = $parameters;
42
43
        // Store alias for this class name
44
        $this->aliases[$className] = $alias ?: $className;
45 6
    }
46
47
    /**
48 6
     * Generate initial class instance declaration
49
     * @param string $className Entity class name
50 6
     */
51
    protected function generateInitialDeclaration($className)
52 6
    {
53
        if (array_key_exists($className, $this->services)) {
54
            // Start service search or creation
55 6
            $this->generator
56
                ->text('isset('.self::STATIC_COLLECTION_VARIABLE.'[\''.$this->aliases[$className].'\'])')
57
                ->newLine('? '.self::STATIC_COLLECTION_VARIABLE.'[\''.$this->aliases[$className].'\']')
58 6
                ->newLine(': '.self::STATIC_COLLECTION_VARIABLE.'[\''.$this->aliases[$className].'\'] = new '.$className.'(')->tabs++;
59
        } else {
60 6
            // Start object instance creation
61
            $this->generator->text('new ' . $className . '(')->tabs++;
62 6
        }
63 6
    }
64 6
65 6
    /**
66
     * Parse class dependencies generated by dependency tree.
67 6
     *
68 6
     * @param mixed $dependency Dependency value
69
     * @param string $variable Dependency name
70
     * @param string $className
71
     *
72
     * @throws ContainerException
73
     */
74
    protected function parseClassDependencies($dependency, $variable, $className)
75
    {
76
        // If dependency value is a string
77
        if (is_string($dependency)) {
78
            // Define if we have this dependency described in dependency tree
79
            if (array_key_exists($dependency, $this->dependencies)) {
80 6
                // Call container logic for this dependency
81
                $this->generator->newLine($this->logicCallable.'(\''.$dependency.'\')');
82
            } else { // String variable
83 6
                $this->generator->newLine()->stringValue($dependency);
84 6
            }
85 6
        } elseif (is_array($dependency)) { // Dependency value is array
86
            $this->generator->newLine()->arrayValue($dependency);
87
        } else {
88 6
            throw new ContainerException('Cannot set dependency for '.$className . '::' . $variable);
89 6
        }
90
    }
91 6
92 6
    /**
93 6
     * Generate container dependency condition code.
94 6
     *
95 6
     * @param string $className
96 1
     * @param mixed  $dependencies
97
     * @param int    $level
98
     *
99 6
     * @throws ContainerException
100
     *
101
     */
102
    protected function generateCondition($className, &$dependencies, $level = 0)
103
    {
104
        $this->generator->newLine(($level === 0) ? 'return ' : '');
105
106
        $this->generateInitialDeclaration($className);
107
108
        // Get last dependency variable name
109
        end($dependencies);
110
        $last = key($dependencies);
111
112 6
        // Iterate all dependencies for this class
113
        foreach ($dependencies as $variable => $dependency) {
114 6
            $this->parseClassDependencies($dependency, $variable, $className);
115
116 6
            // Add comma if this is not last dependency
117
            if ($variable !== $last) {
118
                $this->generator->text(',');
119
            }
120
        }
121
122
        $this->generator->tabs--;
123
124
        if (count($dependencies)) {
125
            $this->generator->newLine(')' . ($level === 0 ? ';' : ''));
126
        } else {
127
            $this->generator->text(')' . ($level === 0 ? ';' : ''));
128 6
        }
129
    }
130
}
131