Passed
Push — master ( 762564...748440 )
by Rustam
02:08
created

CallableWrapper   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 48
Duplicated Lines 0 %

Test Coverage

Coverage 94.12%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 16
c 1
b 0
f 0
dl 0
loc 48
ccs 16
cts 17
cp 0.9412
rs 10
wmc 7

4 Methods

Rating   Name   Duplication   Size   Complexity  
A getReflector() 0 11 3
A getHandlerParameters() 0 5 1
A process() 0 8 2
A __construct() 0 6 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\RequestModel;
6
7
use Psr\Container\ContainerInterface;
8
use Psr\Http\Message\ResponseInterface;
9
use Psr\Http\Message\ServerRequestInterface;
10
use Psr\Http\Server\MiddlewareInterface;
11
use Psr\Http\Server\RequestHandlerInterface;
12
use ReflectionFunction;
13
use ReflectionFunctionAbstract;
14
use ReflectionMethod;
15
use Yiisoft\Injector\Injector;
16
17
final class CallableWrapper implements MiddlewareInterface
18
{
19
    /**
20
     * @var callable
21
     */
22
    private $callback;
23
24 7
    public function __construct(
25
        private ContainerInterface $container,
26
        private HandlerParametersResolver $parametersResolver,
27
        callable $callback
28
    ) {
29 7
        $this->callback = $callback;
30
    }
31
32 5
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
33
    {
34 5
        $params = array_merge(
35 5
            [$request, $handler],
36 5
            $this->parametersResolver->resolve($this->getHandlerParameters(), $request)
37
        );
38 5
        $response = (new Injector($this->container))->invoke($this->callback, $params);
39 5
        return $response instanceof MiddlewareInterface ? $response->process($request, $handler) : $response;
40
    }
41
42 5
    private function getHandlerParameters(): array
43
    {
44
        return $this
45 5
            ->getReflector()
46 5
            ->getParameters();
47
    }
48
49
    /**
50
     * @throws \ReflectionException
51
     *
52
     * @return ReflectionFunction|ReflectionFunctionAbstract|ReflectionMethod
53
     */
54 5
    private function getReflector(): ReflectionFunctionAbstract
55
    {
56 5
        if (is_object($this->callback)) {
57 4
            $this->callback = [$this->callback, '__invoke'];
58
        }
59
60 5
        if (is_array($this->callback)) {
61 5
            return new ReflectionMethod($this->callback[0], $this->callback[1]);
62
        }
63
64
        return new ReflectionFunction($this->callback);
65
    }
66
}
67