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

HTTPMiddlewareAware   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 56
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 0
Metric Value
dl 0
loc 56
rs 10
c 0
b 0
f 0
wmc 5
lcom 1
cbo 1

4 Methods

Rating   Name   Duplication   Size   Complexity  
A getMiddlewares() 0 4 1
A setMiddlewares() 0 6 1
A addMiddleware() 0 5 1
A callMiddleware() 0 12 2
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