ControllerReplacer   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 74
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 25
dl 0
loc 74
rs 10
c 1
b 0
f 0
wmc 6

4 Methods

Rating   Name   Duplication   Size   Complexity  
A createController() 0 9 1
A __construct() 0 8 1
A createMiddlewareRunner() 0 18 1
A withReplacedRequest() 0 14 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Kafkiansky\SymfonyMiddleware\Integration;
6
7
use Kafkiansky\SymfonyMiddleware\Middleware\MiddlewareAction;
8
use Kafkiansky\SymfonyMiddleware\Middleware\MiddlewareRunner;
9
use Kafkiansky\SymfonyMiddleware\Middleware\SymfonyActionRequestHandler;
10
use Kafkiansky\SymfonyMiddleware\Psr\PsrRequestCloner;
11
use Kafkiansky\SymfonyMiddleware\Psr\PsrRequestTransformer;
12
use Kafkiansky\SymfonyMiddleware\Psr\PsrResponseTransformer;
13
use Psr\Http\Server\MiddlewareInterface;
14
use Symfony\Component\HttpFoundation\Request;
15
use Symfony\Component\HttpFoundation\Response;
16
17
final class ControllerReplacer
18
{
19
    private PsrRequestTransformer $psrRequestTransformer;
20
    private PsrResponseTransformer $psrResponseTransformer;
21
    private PsrRequestCloner $psrRequestCloner;
22
23
    public function __construct(
24
        PsrRequestTransformer $psrRequestTransformer,
25
        PsrResponseTransformer $psrResponseTransformer,
26
        PsrRequestCloner $psrRequestCloner,
27
    ) {
28
        $this->psrRequestTransformer = $psrRequestTransformer;
29
        $this->psrResponseTransformer = $psrResponseTransformer;
30
        $this->psrRequestCloner = $psrRequestCloner;
31
    }
32
33
    /**
34
     * @param callable(): Response $originalController
35
     * @param array $arguments
36
     * @param MiddlewareInterface[] $middlewares
37
     * @param Request $symfonyRequest
38
     *
39
     * @return MiddlewareAction
40
     */
41
    public function createController(
42
        callable $originalController,
43
        array $arguments,
44
        array $middlewares,
45
        Request $symfonyRequest
46
    ): MiddlewareAction {
47
        return new MiddlewareAction(
48
            $this->createMiddlewareRunner($middlewares, $originalController, $arguments, $symfonyRequest),
49
            $this->psrRequestTransformer->toPsrRequest($symfonyRequest)
50
        );
51
    }
52
53
    /**
54
     * @param MiddlewareInterface[] $middlewares
55
     */
56
    private function createMiddlewareRunner(
57
        array $middlewares,
58
        callable $destination,
59
        array $arguments,
60
        Request $symfonyRequest
61
    ): MiddlewareRunner {
62
        return new MiddlewareRunner(
63
            $middlewares,
64
            new SymfonyActionRequestHandler(
65
                function (Request $request) use ($destination, $arguments): Response {
66
                    /** @var Response */
67
                    return $destination(...$this->withReplacedRequest($request, $arguments));
68
                },
69
                $symfonyRequest,
70
                $this->psrResponseTransformer,
71
                $this->psrRequestCloner,
72
            ),
73
            $this->psrResponseTransformer,
74
        );
75
    }
76
77
    private function withReplacedRequest(Request $request, array $arguments): array
78
    {
79
        $updatedArguments = [];
80
81
        /** @var object|scalar $argument */
82
        foreach ($arguments as $argument) {
83
            if ($argument instanceof Request) {
84
                $argument = $request;
85
            }
86
87
            $updatedArguments[] = $argument;
88
        }
89
90
        return $updatedArguments;
91
    }
92
}
93