Passed
Pull Request — master (#190)
by Arman
03:12
created

MiddlewareManager::__construct()   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
/**
4
 * Quantum PHP Framework
5
 *
6
 * An open source software development framework for PHP
7
 *
8
 * @package Quantum
9
 * @author Arman Ag. <[email protected]>
10
 * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org)
11
 * @link http://quantum.softberg.org/
12
 * @since 2.9.5
13
 */
14
15
namespace Quantum\Middleware;
16
17
use Quantum\Middleware\Exceptions\MiddlewareException;
18
use Quantum\Di\Exceptions\DiException;
19
use Quantum\Loader\Loader;
20
use Quantum\Http\Response;
21
use Quantum\Http\Request;
22
use ReflectionException;
23
use Quantum\Di\Di;
24
25
/**
26
 * Class MiddlewareManager
27
 * @package Quantum\Middleware
28
 */
29
class MiddlewareManager
30
{
31
32
    /**
33
     * Middlewares queue
34
     * @var array
35
     */
36
    private $middlewares = [];
37
38
    /**
39
     * Current module
40
     * @var string
41
     */
42
    private $module;
43
44
    /**
45
     * MiddlewareManager constructor.
46
     */
47
    public function __construct()
48
    {
49
        $this->middlewares = current_middlewares();
50
        $this->module = current_module();
51
    }
52
53
    /**
54
     * Apply Middlewares
55
     * @param Request $request
56
     * @param Response $response
57
     * @return array
58
     * @throws DiException
59
     * @throws ReflectionException
60
     */
61
    public function applyMiddlewares(Request $request, Response $response): array
62
    {
63
        if (!current($this->middlewares)) {
64
            return [$request, $response];
65
        }
66
67
        $currentMiddleware = $this->getMiddleware($request, $response);
68
69
        list($request, $response) = $currentMiddleware->apply($request, $response, function ($request, $response) {
70
            next($this->middlewares);
71
            return [$request, $response];
72
        });
73
74
        return $this->applyMiddlewares($request, $response);
75
    }
76
77
    /**
78
     * @param Request $request
79
     * @param Response $response
80
     * @return QtMiddleware
81
     * @throws DiException
82
     * @throws ReflectionException
83
     */
84
    private function getMiddleware(Request $request, Response $response): QtMiddleware
85
    {
86
        $middlewarePath = modules_dir() . DS . $this->module . DS . 'Middlewares' . DS . current($this->middlewares) . '.php';
87
88
        $loader = Di::get(Loader::class);
89
90
        return $loader->loadClassFromFile(
91
            $middlewarePath,
92
            function () { return MiddlewareException::middlewareNotFound(current($this->middlewares)); },
93
            function () { return MiddlewareException::notDefined(current($this->middlewares)); },
94
            [$request, $response]
95
        );
96
    }
97
}