Middleware   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 105
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Importance

Changes 3
Bugs 0 Features 0
Metric Value
wmc 8
c 3
b 0
f 0
lcom 1
cbo 5
dl 0
loc 105
rs 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A doPreFilter() 0 12 2
A doPostFilter() 0 12 2
A decorateRequest() 0 6 1
A mergeResponse() 0 8 2
1
<?php
2
namespace wmlib\controller\Filter;
3
4
use Symfony\Component\HttpKernel\HttpKernelInterface;
5
use wmlib\controller\Filter;
6
7
use wmlib\controller\Request;
8
use wmlib\controller\Response;
9
use wmlib\controller\Route;
10
11
use Symfony\Component\HttpFoundation\Request as SymfonyRequest;
12
use Symfony\Component\HttpFoundation\Response as SymfonyResponse;
13
use wmlib\controller\Stream\String;
14
15
/**
16
 * Middlewares support.
17
 * Filter can reuse any Symfony HttpKernelInterface middleware
18
 *
19
 */
20
class Middleware extends Filter
21
{
22
    /**
23
     * @var HttpKernelInterface|null
24
     */
25
    private $beforeMiddleware;
26
27
    /**
28
     * @var HttpKernelInterface|null
29
     */
30
    private $afterMiddleware;
31
32
    /**
33
     * @param HttpKernelInterface $beforeMiddleware or null
34
     * @param HttpKernelInterface $afterMiddleware or null
35
     */
36
    public function __construct(HttpKernelInterface $beforeMiddleware = null, HttpKernelInterface $afterMiddleware = null)
37
    {
38
        $this->beforeMiddleware = $beforeMiddleware;
39
        $this->afterMiddleware = $afterMiddleware;
40
    }
41
42
    /**
43
     * Pre filter method
44
     *
45
     * For process the rest of filter chain this code should be call inside:
46
     * <code>
47
     * $filterChain->doPreFilter ();
48
     * </code>
49
     *
50
     * @param Request $request
51
     * @param Response $response
52
     * @param Chain $filterChain
53
     * @return Response|null
54
     */
55
    public function doPreFilter(Request $request, Response $response, Chain $filterChain)
56
    {
57
        if ($this->beforeMiddleware !== null) {
58
            $symphony_response = $this->beforeMiddleware->handle($this->decorateRequest($request), HttpKernelInterface::MASTER_REQUEST, false);
59
60
            $response = $this->mergeResponse($response, $symphony_response);
61
62
            return $response;
63
        } else {
64
            return $filterChain->doPreFilter($request, $response);
65
        }
66
    }
67
68
    /**
69
     * Post filter method.
70
     * This should be redefined in post filter.
71
     *
72
     * For process the rest of filter chain this code should be call inside:
73
     * <code>
74
     * $filterChain->doPostFilter ();
75
     * </code>
76
     *
77
     * @param Request $request
78
     * @param Response $response
79
     * @param Chain $filterChain
80
     * @param bool $flag
81
     * @return Response|void
82
     */
83
    public function doPostFilter(Request $request, Response $response, Chain $filterChain, $flag = true)
84
    {
85
        if ($this->afterMiddleware !== null) {
86
            $symphony_response = $this->afterMiddleware->handle($this->decorateRequest($request), HttpKernelInterface::MASTER_REQUEST, false);
87
88
            $response = $this->mergeResponse($response, $symphony_response);
89
90
            return $response;
91
        } else {
92
            return $filterChain->doPostFilter($request, $response, $flag);
93
        }
94
    }
95
96
    /**
97
     * Decorate lib request to symfony request
98
     *
99
     * @param Request $request
100
     * @return SymfonyRequest
101
     */
102
    private function decorateRequest(Request $request)
103
    {
104
        $symfony_request = new SymfonyRequest($request->getQueryParams(), $request->getBodyParams(), $request->getAttributes(), $request->getCookies());
105
106
        return $symfony_request;
107
    }
108
109
    /**
110
     * Merge symfony response to lib response
111
     *
112
     * @param Response $response
113
     * @param SymfonyResponse $symfonyResponse
114
     * @return Response
115
     */
116
    private function mergeResponse(Response $response, SymfonyResponse $symfonyResponse)
117
    {
118
        foreach ($symfonyResponse->headers as $header => $line) {
119
            $response = $response->withHeader($header, $line);
120
        }
121
        $response = $response->withBody(new String($symfonyResponse->getContent()));
122
        return $response;
123
    }
124
}