Completed
Pull Request — master (#1)
by Indra
02:41
created

Middleware   A

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