ControllerListener   A
last analyzed

Complexity

Total Complexity 4

Size/Duplication

Total Lines 43
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 20
dl 0
loc 43
rs 10
c 0
b 0
f 0
wmc 4

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 1
A onControllerArguments() 0 23 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Kafkiansky\SymfonyMiddleware\Integration;
6
7
use Kafkiansky\SymfonyMiddleware\Attribute\Reader\AttributeReader;
8
use Kafkiansky\SymfonyMiddleware\Middleware\MiddlewareGatherer;
9
use Kafkiansky\SymfonyMiddleware\Middleware\MiddlewareNotConfigured;
10
use Symfony\Component\HttpFoundation\Response;
11
use Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent;
12
13
final class ControllerListener
14
{
15
    private MiddlewareGatherer $middlewareGatherer;
16
    private AttributeReader $reader;
17
    private ControllerReplacer $controllerReplacer;
18
19
    public function __construct(
20
        MiddlewareGatherer $middlewareGatherer,
21
        AttributeReader $reader,
22
        ControllerReplacer $controllerReplacer
23
    ) {
24
        $this->middlewareGatherer = $middlewareGatherer;
25
        $this->reader = $reader;
26
        $this->controllerReplacer = $controllerReplacer;
27
    }
28
29
    /**
30
     * @throws MiddlewareNotConfigured
31
     * @throws \ReflectionException
32
     */
33
    public function onControllerArguments(ControllerArgumentsEvent $event): void
34
    {
35
        /** @var object|array{object, string} $controller */
36
        $controller = $event->getController();
37
        $method = null; // null if controller is invokable.
38
39
        if (\is_array($controller)) {
40
            list($controller, $method) = $controller;
41
        }
42
43
        $attributes = $this->reader->read($controller, $method);
44
45
        $middlewares = $this->middlewareGatherer->gather($attributes);
46
47
        if (count($middlewares) > 0) {
48
            /** @psalm-var callable(): Response $originalController */
49
            $originalController = $event->getController();
50
51
            $event->setController($this->controllerReplacer->createController(
52
                $originalController,
53
                $event->getArguments(),
54
                $middlewares,
55
                $event->getRequest()
56
            ));
57
        }
58
    }
59
}
60