Passed
Push — master ( 2d893f...5de32f )
by Atanas
02:41
created

ExecutesMiddlewareTrait::executeMiddleware()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 19
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 11
nc 2
nop 3
dl 0
loc 19
ccs 7
cts 7
cp 1
crap 2
rs 9.9
c 0
b 0
f 0
1
<?php
2
/**
3
 * @package   WPEmerge
4
 * @author    Atanas Angelov <[email protected]>
5
 * @copyright 2018 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 Closure;
13
use WPEmerge\Facades\Application;
14
use WPEmerge\Requests\RequestInterface;
15
16
/**
17
 * Allow objects to execute middleware.
18
 */
19
trait ExecutesMiddlewareTrait {
20
	/**
21
	 * Execute an array of middleware recursively (last in, first out).
22
	 *
23
	 * @param  array<array<string>>                $middleware
24
	 * @param  RequestInterface                    $request
25
	 * @param  Closure                             $next
26
	 * @return \Psr\Http\Message\ResponseInterface
27
	 */
28 3
	public function executeMiddleware( $middleware, RequestInterface $request, Closure $next ) {
29 3
		$top_middleware = array_shift( $middleware );
30
31 3
		if ( $top_middleware === null ) {
32 3
			return $next( $request );
33
		}
34
35 2
		$top_middleware_next = function ( $request ) use ( $middleware, $next ) {
36 2
			return $this->executeMiddleware( $middleware, $request, $next );
37 2
		};
38
39
		$class = $top_middleware[0];
40
		$arguments = array_merge(
41
			[$request, $top_middleware_next],
42
			array_slice( $top_middleware, 1 )
43
		);
44
		$instance = Application::instantiate( $class );
45
46
		return call_user_func_array( [$instance, 'handle'], $arguments );
47
	}
48
}
49