Passed
Push — master ( 517cb3...2c2725 )
by Atanas
02:15
created

HasMiddlewareTrait::executeMiddleware()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 13
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 7
c 0
b 0
f 0
nc 2
nop 3
dl 0
loc 13
ccs 8
cts 8
cp 1
crap 2
rs 9.4285
1
<?php
2
3
namespace WPEmerge\Middleware;
4
5
use Closure;
6
use Exception;
7
use WPEmerge\Helpers\Mixed;
8
9
/**
10
 * Allow objects to have middleware
11
 */
12
trait HasMiddlewareTrait {
13
	/**
14
	 * Array of all registered middleware
15
	 *
16
	 * @var array
17
	 */
18
	protected $middleware = [];
19
20
	/**
21
	 * Check if the passed entity is a valid middleware
22
	 *
23
	 * @param  mixed   $middleware
24
	 * @return boolean
25
	 */
26 7
	protected function isMiddleware( $middleware ) {
27 7
		if ( is_a( $middleware, Closure::class ) ) {
28 1
			return true;
29
		}
30
31 6
		return is_a( $middleware, MiddlewareInterface::class, true );
32
	}
33
34
	/**
35
	 * Get registered middleware
36
	 *
37
	 * @return array
38
	 */
39 5
	public function getMiddleware() {
40 5
		return $this->middleware;
41
	}
42
43
	/**
44
	 * Add middleware.
45
	 * Accepts: a class name, an instance of a class, a Closure or an array of any of the previous
46
	 *
47
	 * @throws Exception
48
	 * @param  string|\Closure|\WPEmerge\Middleware\MiddlewareInterface|array $middleware
49
	 * @return static                                                         $this
50
	 */
51 7
	public function addMiddleware( $middleware ) {
52 7
		$middleware = Mixed::toArray( $middleware );
53
54 7
		foreach ( $middleware as $item ) {
55 7
			if ( ! $this->isMiddleware( $item ) ) {
56 2
				throw new Exception( 'Passed middleware must be a closure or the name or instance of a class which implements the ' . MiddlewareInterface::class . ' interface.' );
57
			}
58 5
		}
59
60 5
		$this->middleware = array_merge( $this->getMiddleware(), $middleware );
61 5
		return $this;
62
	}
63
64
	/**
65
	 * Alias for addMiddleware.
66
	 * Accepts: a class name, an instance of a class, a Closure or an array of any of the previous
67
	 *
68
	 * @codeCoverageIgnore
69
	 * @param  string|\Closure|\WPEmerge\Middleware\MiddlewareInterface|array $middleware
70
	 * @return static                                                         $this
71
	 */
72
	public function add( $middleware ) {
73
		return call_user_func_array( [$this, 'addMiddleware'], func_get_args() );
74
	}
75
76
	/**
77
	 * Execute an array of middleware recursively (last in, first out)
78
	 *
79
	 * @param  array                               $middleware
80
	 * @param  \WPEmerge\Request                   $request
81
	 * @param  Closure                             $next
82
	 * @return \Psr\Http\Message\ResponseInterface
83
	 */
84 5
	public function executeMiddleware( $middleware, $request, Closure $next ) {
85 5
		$top_middleware = array_pop( $middleware );
86
87 5
		if ( $top_middleware === null ) {
88 5
			return $next( $request );
89
		}
90
91 4
		$top_middleware_next = function( $request ) use ( $middleware, $next ) {
92 4
			return $this->executeMiddleware( $middleware, $request, $next );
93 4
		};
94
95 4
		return Mixed::value( $top_middleware, [$request, $top_middleware_next], 'handle' );
96
	}
97
}
98