Completed
Push — master ( daed8c...cf758d )
by Damian
08:03
created

HTTPMiddlewareAware::getMiddlewares()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 0
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace SilverStripe\Control\Middleware;
4
5
use SilverStripe\Control\HTTPRequest;
6
use SilverStripe\Control\HTTPResponse;
7
8
/**
9
 * Adds middleware support to an object.
10
 * Provides a Middlewares property and a callMiddleware() callback
11
 */
12
trait HTTPMiddlewareAware
13
{
14
    /**
15
     * @var HTTPMiddleware[]
16
     */
17
    protected $middlewares = [];
18
19
    /**
20
     * @return HTTPMiddleware[]
21
     */
22
    public function getMiddlewares()
23
    {
24
        return $this->middlewares;
25
    }
26
27
    /**
28
     * @param HTTPMiddleware[] $middlewares
29
     * @return $this
30
     */
31
    public function setMiddlewares($middlewares)
32
    {
33
        // Allow nulls in the middlewares array to deal with limitations of yml config
34
        $this->middlewares = array_filter((array)$middlewares);
35
        return $this;
36
    }
37
38
    /**
39
     * @param HTTPMiddleware $middleware
40
     * @return $this
41
     */
42
    public function addMiddleware(HTTPMiddleware $middleware)
43
    {
44
        $this->middlewares[] = $middleware;
45
        return $this;
46
    }
47
48
    /**
49
     * Call middleware
50
     *
51
     * @param HTTPRequest $request The request to pass to the middlewares and callback
52
     * @param callable $last The callback to call after all middlewares
53
     * @return HTTPResponse
54
     */
55
    protected function callMiddleware(HTTPRequest $request, callable $last)
56
    {
57
        // Reverse middlewares
58
        $next = $last;
59
        /** @var HTTPMiddleware $middleware */
60
        foreach (array_reverse($this->getMiddlewares()) as $middleware) {
61
            $next = function ($request) use ($middleware, $next) {
62
                return $middleware->process($request, $next);
63
            };
64
        }
65
        return $next($request);
66
    }
67
}
68