Passed
Push — master ( 2bb76e...2f1c34 )
by Atanas
02:14
created

HasMiddlewareTrait   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 88
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
dl 0
loc 88
ccs 20
cts 20
cp 1
rs 10
c 0
b 0
f 0
wmc 11
lcom 1
cbo 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A isMiddleware() 0 7 2
A getMiddleware() 0 3 1
A addMiddleware() 0 12 4
A add() 0 3 1
A executeMiddleware() 0 18 3
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 5
				throw new Exception( 'Passed middleware must be a callable or the name of a class which implements the ' . MiddlewareInterface::class . ' interface.' );
55
			}
56
		}
57
58 4
		$this->middleware = array_merge( $this->getMiddleware(), $middleware );
59 4
		return $this;
60
	}
61
62
	/**
63
	 * Alias for addMiddleware
64
	 *
65
	 * @codeCoverageIgnore
66
	 * @param  callable|\Obsidian\Middleware\middlewareInterface|array $middleware
67
	 * @return object                                                  $this
68
	 */
69
	public function add( $middleware ) {
70
		return call_user_func_array( [$this, 'addMiddleware'], func_get_args() );
71
	}
72
73
	/**
74
	 * Execute an array of middleware recursively (last in, first out)
75
	 *
76
	 * @param  array             $middleware
77
	 * @param  \Obsidian\Request $request
78
	 * @param  Closure           $next
79
	 * @return ResponseInterface
80
	 */
81 4
	public function executeMiddleware( $middleware, $request, Closure $next ) {
82 4
		$top_middleware = array_pop( $middleware );
83
84 4
		if ( $top_middleware === null ) {
85 4
			return $next( $request );
86
		}
87
88 3
		$top_middleware_next = function( $request ) use ( $middleware, $next ) {
89 3
			return $this->executeMiddleware( $middleware, $request, $next );
90 3
		};
91
92
		if ( is_callable( $top_middleware ) ) {
93
			return call_user_func( $top_middleware, $request, $top_middleware_next );
94
		}
95
96
		$instance = new $top_middleware();
97
		return $instance->handle( $request, $top_middleware_next );
98
	}
99
}
100