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

HasMiddlewareTrait   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 87
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Test Coverage

Coverage 92.59%

Importance

Changes 0
Metric Value
dl 0
loc 87
ccs 25
cts 27
cp 0.9259
rs 10
c 0
b 0
f 0
wmc 11
lcom 1
cbo 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A add() 0 3 1
A isMiddleware() 0 7 2
A getMiddleware() 0 3 1
A addMiddleware() 0 12 4
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 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