PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backup, Restore, Migration & Clone / 3.8.2
WP STAGING – WordPress Backup, Restore, Migration & Clone v3.8.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 4 years ago DependencyResolver.php 2 years ago ResolveBehaviour.php 4 years ago
DependencyResolver.php
93 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 * Class DependencyResolver
11 *
12 * This is a port of https://github.com/anthonykgross/dependency-resolver, adapted to run on our PHP requirement version.
13 *
14 * @package WPStaging\Framework\DependencyResolver
15 */
16 class DependencyResolver
17 {
18 /**
19 * @throws ResolveException
20 */
21 public static function resolve(array $tree, ResolveBehaviour $resolveBehaviour = null)
22 {
23 if (is_null($resolveBehaviour)) {
24 $resolveBehaviour = ResolveBehaviour::create()->setThrowOnCircularReference(true);
25 }
26
27 $resolved = [];
28 $unresolved = [];
29
30 // Resolve dependencies for each table
31 foreach (array_keys($tree) as $table) {
32 list($resolved, $unresolved, $returnImmediately) = self::resolver($table, $tree, $resolved, $unresolved, $resolveBehaviour);
33
34 if ($returnImmediately) {
35 return $resolved;
36 }
37 }
38
39 return $resolved;
40 }
41
42 /**
43 * @param int|string $item
44 *
45 * @throws ResolveException
46 */
47 private static function resolver($item, array $items, array $resolved, array $unresolved, ResolveBehaviour $resolveBehaviour)
48 {
49 $unresolved[] = $item;
50
51 foreach ($items[$item] as $dep) {
52 if (!array_key_exists($dep, $items)) {
53 if ($resolveBehaviour->isThrowOnMissingReference()) {
54 throw new MissingReferenceException($item, $dep);
55 }
56
57 return [$resolved, $unresolved, true];
58 }
59
60 if (in_array($dep, $resolved, true)) {
61 continue;
62 }
63
64 if (in_array($dep, $unresolved, true)) {
65 if ($resolveBehaviour->isThrowOnCircularReference()) {
66 throw new CircularReferenceException($item, $dep);
67 }
68
69 return [$resolved, $unresolved, true];
70 }
71
72 $unresolved[] = $dep;
73 list($resolved, $unresolved, $returnImmediately) = self::resolver($dep, $items, $resolved, $unresolved, $resolveBehaviour);
74
75 if ($returnImmediately) {
76 return [$resolved, $unresolved, $returnImmediately];
77 }
78 }
79
80 // Add $item to $resolved if it's not already there
81 if (!in_array($item, $resolved, true)) {
82 $resolved[] = $item;
83 }
84
85 // Remove all occurrences of $item in $unresolved
86 while (($index = array_search($item, $unresolved, true)) !== false) {
87 unset($unresolved[$index]);
88 }
89
90 return [$resolved, $unresolved, false];
91 }
92 }
93