Completed
Push — director-middleware ( 408832...334a87 )
by Sam
08:23
created

HTTPMiddlewareAware::callMiddleware()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

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