Passed
Push — master ( cd8198...2bb76e )
by Atanas
02:42
created

HasMiddlewareTrait::add()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
ccs 0
cts 2
cp 0
crap 2
1
<?php
2
3
namespace Obsidian\Middleware;
4
5
use Closure;
6
use Exception;
7
use Psr\Http\Message\ResponseInterface;
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 5
	protected function isMiddleware( $middleware ) {
27 5
		if ( is_callable( $middleware ) ) {
28 1
			return true;
29
		}
30
31 4
		return is_a( $middleware, MiddlewareInterface::class, true );
32
	}
33
34
	/**
35
	 * Get registered middleware
36
	 *
37
	 * @return array
38
	 */
39 4
	public function getMiddleware() {
40 4
		return $this->middleware;
41
	}
42
43
	/**
44
	 * Add middleware
45
	 *
46
	 * @param  callable|\Obsidian\Middleware\MiddlewareInterface|array $middleware
47
	 * @return object                                                  $this
48
	 */
49 5
	public function addMiddleware( $middleware ) {
50 5
		$middleware = is_array( $middleware ) ? $middleware : [$middleware];
51
52 5
		foreach ( $middleware as $item ) {
53 5
			if ( ! $this->isMiddleware( $item ) ) {
54 1
				throw new Exception( 'Passed middleware must be a callable or the name of a class which implements the ' . MiddlewareInterface::class . ' interface.' );
55
			}
56 4
		}
57
58 4
		$this->middleware = array_merge( $this->getMiddleware(), $middleware );
59 4
		return $this;
60
	}
61
62
	/**
63
	 * Alias for addMiddleware
64
	 *
65
	 * @param  callable|\Obsidian\Middleware\middlewareInterface|array $middleware
66
	 * @return object                                                  $this
67
	 */
68
	public function add( $middleware ) {
69
		return $this->addMiddleware( $middleware );
70
	}
71
72
	/**
73
	 * Execute an array of middleware recursively (last in, first out)
74
	 *
75
	 * @param  array             $middleware
76
	 * @param  \Obsidian\Request $request
77
	 * @param  Closure           $next
78
	 * @return ResponseInterface
79
	 */
80 4
	public function executeMiddleware( $middleware, $request, Closure $next ) {
81 4
		$top_middleware = array_pop( $middleware );
82
83 4
		if ( $top_middleware === null ) {
84 4
			return $next( $request );
85
		}
86
87 3
		$top_middleware_next = function( $request ) use ( $middleware, $next ) {
88 3
			return $this->executeMiddleware( $middleware, $request, $next );
89 3
		};
90
91 3
		if ( is_callable( $top_middleware ) ) {
92 2
			return call_user_func( $top_middleware, $request, $top_middleware_next );
93
		}
94
95 1
		$instance = new $top_middleware();
96 1
		return $instance->handle( $request, $top_middleware_next );
97
	}
98
}
99