Issues (5)

src/DependencyTree.php (1 issue)

Severity
1
<?php
2
3
namespace bultonFr\DependencyTree;
4
5
use \Exception;
6
7
class DependencyTree
8
{
9
    /**
10
     * @var array $dependencies : List of dependency with there infos;
11
     */
12
    protected $dependencies = [];
13
    
14
    /**
15
     * Add a dependency to system
16
     * 
17
     * @param string $name         : Dependency's name
18
     * @param int    $order        : Order to load dependency
19
     * @param array  $dependencies : All dependencies for this dependency
20
     * 
21
     * @throws Exception : If dependency already declared
22
     * 
23
     * @return DependencyTree : Current instance
24
     */
25
    public function addDependency($name, $order = 0, $dependencies = [])
26
    {
27
        //Check if dependency is already declared.
28
        if (isset($this->dependencies[$name])) {
29
            throw new Exception('Dependency '.$name.' already declared.');
30
        }
31
        
32
        if (!is_array($dependencies)) {
0 ignored issues
show
The condition is_array($dependencies) is always true.
Loading history...
33
            throw new Exception('Dependencies must be passed in a array.');
34
        }
35
36
        $dependencyInfos               = new \stdClass;
37
        $dependencyInfos->order        = (int) $order;
38
        $dependencyInfos->dependencies = $dependencies;
39
40
        $this->dependencies[$name] = $dependencyInfos;
41
        
42
        return $this;
43
    }
44
45
    /**
46
     * Generate the dependency tree
47
     * 
48
     * @return array
49
     */
50
    public function generateTree()
51
    {
52
        $firstTree = $this->generateOrderTree();
53
        $finalTree = $this->generateDependenciesTree($firstTree);
54
        
55
        return $finalTree;
56
    }
57
    
58
    /**
59
     * Generate the first tree. It's a order tree
60
     * 
61
     * @return array : the order tree
62
     */
63
    protected function generateOrderTree()
64
    {
65
        $tree = new Tree;
66
        
67
        //add all dependency to the Tree
68
        foreach ($this->dependencies as $dependencyName => $dependencyInfos) {
69
            $tree->addDependency(
70
                $dependencyName,
71
                $dependencyInfos->order,
72
                $dependencyInfos->dependencies
73
            );
74
        }
75
        
76
        return $tree->generateTree();
77
    }
78
    
79
    /**
80
     * Generate the second tree. It's a dependency tree
81
     * 
82
     * @param array $orderTree : The first tree
83
     * 
84
     * @return array : The final tree
85
     */
86
    protected function generateDependenciesTree($orderTree)
87
    {
88
        //Read the orderTree and generate a tree
89
        //for each line of the first tree
90
        
91
        foreach ($orderTree as $order => $dependencies) {
92
            $tree = new Tree;
93
            
94
            foreach ($dependencies as $dependencyName) {
95
                $dependencyInfos = $this->dependencies[$dependencyName];
96
                
97
                $tree->addDependency(
98
                    $dependencyName,
99
                    -1, //Order negative because it's generate after
100
                    $dependencyInfos->dependencies
101
                );
102
            }
103
            
104
            //Generate the order of dependencies from the depends
105
            $tree->generateOrderFromDependencies();
106
            
107
            //Generate the tree for this line of the final tree
108
            $orderTree[$order] = $tree->generateTree();
109
        }
110
        
111
        return $orderTree;
112
    }
113
}
114