PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backups, Restore, Migration & Clone / 4.11.1
WP STAGING – WordPress Backups, Restore, Migration & Clone v4.11.1
4.11.1 4.11.0 4.10.0 4.9.5 4.9.4 4.9.3 4.9.2 4.9.1 4.9.0 4.8.1 trunk 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.10.0 3.2.0 3.3.1 3.3.2 3.3.3 3.4.1 3.4.3 3.5.0 3.6.0 3.7.1 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.8.6 3.8.7 3.9.0 3.9.1 3.9.2 3.9.3 3.9.4 4.0.0 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.8.0
wp-staging / Framework / DependencyResolver / DependencyResolver.php
wp-staging / Framework / DependencyResolver Last commit date
Exceptions 1 week ago DependencyResolver.php 1 week ago ResolveBehaviour.php 1 week ago
DependencyResolver.php
94 lines
1 <?php
2
3 namespace WPStaging\Framework\DependencyResolver;
4
5 use WPStaging\Framework\DependencyResolver\Exceptions\CircularReferenceException;
6 use WPStaging\Framework\DependencyResolver\Exceptions\MissingReferenceException;
7 use WPStaging\Framework\DependencyResolver\Exceptions\ResolveException;
8
9
10
11
12
13
14
15
16 class DependencyResolver
17 {
18
19
20
21
22 public static function resolve(array $tree, $resolveBehaviour = null)
23 {
24 if (is_null($resolveBehaviour)) {
25 $resolveBehaviour = ResolveBehaviour::create()->setThrowOnCircularReference(true);
26 }
27
28 $resolved = [];
29 $unresolved = [];
30
31
32 foreach (array_keys($tree) as $table) {
33 list($resolved, $unresolved, $returnImmediately) = self::resolver($table, $tree, $resolved, $unresolved, $resolveBehaviour);
34
35 if ($returnImmediately) {
36 return $resolved;
37 }
38 }
39
40 return $resolved;
41 }
42
43
44
45
46
47
48 private static function resolver($item, array $items, array $resolved, array $unresolved, ResolveBehaviour $resolveBehaviour)
49 {
50 $unresolved[] = $item;
51
52 foreach ($items[$item] as $dep) {
53 if (!array_key_exists($dep, $items)) {
54 if ($resolveBehaviour->isThrowOnMissingReference()) {
55 throw new MissingReferenceException($item, $dep);
56 }
57
58 return [$resolved, $unresolved, true];
59 }
60
61 if (in_array($dep, $resolved, true)) {
62 continue;
63 }
64
65 if (in_array($dep, $unresolved, true)) {
66 if ($resolveBehaviour->isThrowOnCircularReference()) {
67 throw new CircularReferenceException($item, $dep);
68 }
69
70 return [$resolved, $unresolved, true];
71 }
72
73 $unresolved[] = $dep;
74 list($resolved, $unresolved, $returnImmediately) = self::resolver($dep, $items, $resolved, $unresolved, $resolveBehaviour);
75
76 if ($returnImmediately) {
77 return [$resolved, $unresolved, $returnImmediately];
78 }
79 }
80
81
82 if (!in_array($item, $resolved, true)) {
83 $resolved[] = $item;
84 }
85
86
87 while (($index = array_search($item, $unresolved, true)) !== false) {
88 unset($unresolved[$index]);
89 }
90
91 return [$resolved, $unresolved, false];
92 }
93 }
94