HasMiddlewareDefinitionsTrait::uniqueMiddleware()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 2
ccs 2
cts 2
cp 1
crap 1
rs 10
c 0
b 0
f 0
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\Middleware;
11
12
use WPEmerge\Exceptions\ConfigurationException;
13
14
/**
15
 * Provide middleware definitions.
16
 */
17
trait HasMiddlewareDefinitionsTrait {
18
	/**
19
	 * Middleware available to the application.
20
	 *
21
	 * @var array<string, string>
22
	 */
23
	protected $middleware = [];
24
25
	/**
26
	 * Middleware groups.
27
	 *
28
	 * @var array<string, string[]>
29
	 */
30
	protected $middleware_groups = [];
31
32
	/**
33
	 * Middleware groups that should have the 'wpemerge' and 'global' groups prepended to them.
34
	 *
35
	 * @var string[]
36
	 */
37
	protected $prepend_special_groups_to = [
38
		'web',
39
		'admin',
40
		'ajax',
41
	];
42
43
	/**
44
	 * Register middleware.
45
	 *
46
	 * @codeCoverageIgnore
47
	 * @param  array<string, string> $middleware
48
	 * @return void
49
	 */
50
	public function setMiddleware( $middleware ) {
51
		$this->middleware = $middleware;
52
	}
53
54
	/**
55
	 * Register middleware groups.
56
	 *
57
	 * @codeCoverageIgnore
58
	 * @param  array<string, string[]> $middleware_groups
59
	 * @return void
60
	 */
61
	public function setMiddlewareGroups( $middleware_groups ) {
62
		$this->middleware_groups = $middleware_groups;
63
	}
64
65
	/**
66
	 * Filter array of middleware into a unique set.
67
	 *
68
	 * @param  array[]  $middleware
69
	 * @return string[]
70
	 */
71 1
	public function uniqueMiddleware( $middleware ) {
72 1
		return array_values( array_unique( $middleware, SORT_REGULAR ) );
73
	}
74
75
	/**
76
	 * Expand array of middleware into an array of fully qualified class names.
77
	 *
78
	 * @param  string[] $middleware
79
	 * @return array[]
80
	 */
81 1
	public function expandMiddleware( $middleware ) {
82 1
		$classes = [];
83
84 1
		foreach ( $middleware as $item ) {
85 1
			$classes = array_merge(
86 1
				$classes,
87 1
				$this->expandMiddlewareMolecule( $item )
88
			);
89
		}
90
91 1
		return $classes;
92
	}
93
94
	/**
95
	 * Expand a middleware group into an array of fully qualified class names.
96
	 *
97
	 * @param  string  $group
98
	 * @return array[]
99
	 */
100 3
	public function expandMiddlewareGroup( $group ) {
101 3
		if ( ! isset( $this->middleware_groups[ $group ] ) ) {
102 1
			throw new ConfigurationException( 'Unknown middleware group "' . $group . '" used.' );
103
		}
104
105 2
		$middleware = $this->middleware_groups[ $group ];
106
107 2
		if ( in_array( $group, $this->prepend_special_groups_to, true ) ) {
108 1
			$middleware = array_merge( ['wpemerge', 'global'], $middleware );
109
		}
110
111 2
		return $this->expandMiddleware( $middleware );
112
	}
113
114
	/**
115
	 * Expand middleware into an array of fully qualified class names and any companion arguments.
116
	 *
117
	 * @param  string  $middleware
118
	 * @return array[]
119
	 */
120 5
	public function expandMiddlewareMolecule( $middleware ) {
121 5
		$pieces = explode( ':', $middleware, 2 );
122
123 5
		if ( count( $pieces ) > 1 ) {
124 1
			return [array_merge( [$this->expandMiddlewareAtom( $pieces[0] )], explode( ',', $pieces[1] ) )];
125
		}
126
127 4
		if ( isset( $this->middleware_groups[ $middleware ] ) ) {
128 1
			return $this->expandMiddlewareGroup( $middleware );
129
		}
130
131 4
		return [[$this->expandMiddlewareAtom( $middleware )]];
132
	}
133
134
	/**
135
	 * Expand a single middleware a fully qualified class name.
136
	 *
137
	 * @param  string $middleware
138
	 * @return string
139
	 */
140 3
	public function expandMiddlewareAtom( $middleware ) {
141 3
		if ( isset( $this->middleware[ $middleware ] ) ) {
142 1
			return $this->middleware[ $middleware ];
143
		}
144
145 2
		if ( class_exists( $middleware ) ) {
146 1
			return $middleware;
147
		}
148
149 1
		throw new ConfigurationException( 'Unknown middleware "' . $middleware . '" used.' );
150
	}
151
}
152