Middleware   A
last analyzed

Complexity

Total Complexity 11

Size/Duplication

Total Lines 64
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
eloc 29
dl 0
loc 64
ccs 0
cts 44
cp 0
rs 10
c 0
b 0
f 0
wmc 11

4 Methods

Rating   Name   Duplication   Size   Complexity  
A isMiddlewareExists() 0 13 4
A getMiddlewares() 0 21 4
A sortMiddlewares() 0 7 1
A addMiddleware() 0 12 2
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the MiddlewareBundle
7
 *
8
 * (c) Indra Gunawan <[email protected]>
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Indragunawan\MiddlewareBundle;
15
16
/**
17
 * @author Indra Gunawan <[email protected]>
18
 */
19
final class Middleware
20
{
21
    private $middlewares = [];
22
    private $sorted = [];
23
24
    public function addMiddleware(string $event, string $name, \Closure $middleware, int $priority = 0): void
25
    {
26
        if ($this->isMiddlewareExists($event, $name)) {
27
            throw new \InvalidArgumentException(sprintf('Duplicate middleware of name "%s" on "%s" event.', $name, $event));
28
        }
29
30
        $this->middlewares[$event][] = [
31
            'name' => $name,
32
            'priority' => $priority,
33
            'middleware' => $middleware,
34
        ];
35
        $this->sorted[$event] = false;
36
    }
37
38
    public function getMiddlewares(string $event, array $names): array
39
    {
40
        if (empty($this->middlewares[$event]) || empty($names)) {
41
            return [];
42
        }
43
44
        if (false === $this->sorted[$event]) {
45
            $this->sortMiddlewares($event);
46
        }
47
48
        $middlewares = array_filter($this->middlewares[$event], function (array $middleware) use ($names) {
49
            return \in_array($middleware['name'], $names, true);
50
        });
51
52
        $middlewares = array_reduce($middlewares, function (array $result, array $middleware) {
53
            $result[$middleware['name']] = $middleware['middleware']();
54
55
            return $result;
56
        }, []);
57
58
        return $middlewares;
59
    }
60
61
    private function sortMiddlewares(string $event)
62
    {
63
        // sort middleware by priority desc
64
        usort($this->middlewares[$event], function (array $a, array $b) {
65
            return $b['priority'] <=> $a['priority'];
66
        });
67
        $this->sorted[$event] = true;
68
    }
69
70
    private function isMiddlewareExists(string $event, string $name): bool
71
    {
72
        if (!isset($this->middlewares[$event])) {
73
            return false;
74
        }
75
76
        foreach ($this->middlewares[$event] as $middleware) {
77
            if ($name === $middleware['name']) {
78
                return true;
79
            }
80
        }
81
82
        return false;
83
    }
84
}
85