-
Notifications
You must be signed in to change notification settings - Fork 42
Expand file tree
/
Copy pathExecutesMiddlewareTrait.php
More file actions
55 lines (47 loc) · 1.37 KB
/
ExecutesMiddlewareTrait.php
File metadata and controls
55 lines (47 loc) · 1.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
/**
* @package WPEmerge
* @author Atanas Angelov <hi@atanas.dev>
* @copyright 2017-2019 Atanas Angelov
* @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0
* @link https://wpemerge.com/
*/
namespace WPEmerge\Middleware;
use Closure;
use Psr\Http\Message\ResponseInterface;
use WPEmerge\Requests\RequestInterface;
/**
* Executes middleware.
*/
trait ExecutesMiddlewareTrait {
/**
* Make a middleware class instance.
*
* @param string $class
* @return object
*/
abstract protected function makeMiddleware( $class );
/**
* Execute an array of middleware recursively (last in, first out).
*
* @param string[][] $middleware
* @param RequestInterface $request
* @param Closure $next
* @return ResponseInterface
*/
protected function executeMiddleware( $middleware, RequestInterface $request, Closure $next ) {
$top_middleware = array_shift( $middleware );
if ( $top_middleware === null ) {
return $next( $request );
}
$top_middleware_next = function ( $request ) use ( $middleware, $next ) {
return $this->executeMiddleware( $middleware, $request, $next );
};
$instance = $this->makeMiddleware( $top_middleware[0] );
$arguments = array_merge(
[$request, $top_middleware_next],
array_slice( $top_middleware, 1 )
);
return call_user_func_array( [$instance, 'handle'], $arguments );
}
}