Test Failed
Pull Request — master (#48)
by Alexander
02:18
created

CallableWrapper::getHandlerParameters()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 3
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 5
rs 10
ccs 1
cts 1
cp 1
crap 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
    public function __construct(
25
        private ContainerInterface $container,
26
        private HandlerParametersResolver $parametersResolver,
27 6
        callable $callback
28
    ) {
29 6
        $this->callback = $callback;
30 6
    }
31 6
32
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
33
    {
34 4
        $params = array_merge(
35
            [$request, $handler],
36 4
            $this->parametersResolver->resolve($this->getHandlerParameters(), $request)
37 4
        );
38 4
        $response = (new Injector($this->container))->invoke($this->callback, $params);
39
        return $response instanceof MiddlewareInterface ? $response->process($request, $handler) : $response;
40 4
    }
41 4
42
    private function getHandlerParameters(): array
43
    {
44 4
        return $this
45
            ->getReflector()
46
            ->getParameters();
47 4
    }
48 4
49
    /**
50
     * @throws \ReflectionException
51
     *
52
     * @return ReflectionFunction|ReflectionFunctionAbstract|ReflectionMethod
53
     */
54
    private function getReflector(): ReflectionFunctionAbstract
55
    {
56 4
        if (is_object($this->callback)) {
57
            $this->callback = [$this->callback, '__invoke'];
58 4
        }
59 3
60
        if (is_array($this->callback)) {
61
            return new ReflectionMethod($this->callback[0], $this->callback[1]);
62 4
        }
63 4
64
        return new ReflectionFunction($this->callback);
65
    }
66
}
67