SortsMiddlewareTrait::getMiddlewarePriority()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 2
ccs 0
cts 0
cp 0
crap 2
rs 10
1
<?php
2
/**
3
 * @package   WPEmerge
4
 * @author    Atanas Angelov <[email protected]>
5
 * @copyright 2017-2019 Atanas Angelov
6
 * @license   https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0
7
 * @link      https://wpemerge.com/
8
 */
9
10
namespace WPEmerge\Routing;
11
12
/**
13
 * Provide middleware sorting.
14
 */
15
trait SortsMiddlewareTrait {
16
	/**
17
	 * Middleware sorted in order of execution.
18
	 *
19
	 * @var string[]
20
	 */
21
	protected $middleware_priority = [];
22
23
	/**
24
	 * Get middleware execution priority.
25
	 *
26
	 * @codeCoverageIgnore
27
	 * @return string[]
28
	 */
29
	public function getMiddlewarePriority() {
30
		return $this->middleware_priority;
31
	}
32
33
	/**
34
	 * Set middleware execution priority.
35
	 *
36
	 * @codeCoverageIgnore
37
	 * @param  string[] $middleware_priority
38
	 * @return void
39
	 */
40
	public function setMiddlewarePriority( $middleware_priority ) {
41
		$this->middleware_priority = $middleware_priority;
42
	}
43
44
	/**
45
	 * Get priority for a specific middleware.
46
	 * This is in reverse compared to definition order.
47
	 * Middleware with unspecified priority will yield -1.
48
	 *
49
	 * @param  string|array $middleware
50
	 * @return integer
51
	 */
52 1
	public function getMiddlewarePriorityForMiddleware( $middleware ) {
53 1
		if ( is_array( $middleware ) ) {
54 1
			$middleware = $middleware[0];
55
		}
56
57 1
		$increasing_priority = array_reverse( $this->getMiddlewarePriority() );
58 1
		$priority = array_search( $middleware, $increasing_priority );
59 1
		return $priority !== false ? (int) $priority : -1;
60
	}
61
62
	/**
63
	 * Sort array of fully qualified middleware class names by priority in ascending order.
64
	 *
65
	 * @param  string[] $middleware
66
	 * @return array
67
	 */
68 1
	public function sortMiddleware( $middleware ) {
69 1
		$sorted = $middleware;
70
71
		usort( $sorted, function ( $a, $b ) use ( $middleware ) {
72 1
			$a_priority = $this->getMiddlewarePriorityForMiddleware( $a );
73 1
			$b_priority = $this->getMiddlewarePriorityForMiddleware( $b );
74 1
			$priority = $b_priority - $a_priority;
75
76 1
			if ( $priority !== 0 ) {
77 1
				return $priority;
78
			}
79
80
			// Keep relative order from original array.
81 1
			return array_search( $a, $middleware ) - array_search( $b, $middleware );
82 1
		} );
83
84 1
		return array_values( $sorted );
85
	}
86
}
87