PhpClassInvoker::invoke()   A
last analyzed

Complexity

Conditions 5
Paths 5

Size

Total Lines 26
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 5
eloc 15
c 1
b 0
f 0
nc 5
nop 1
dl 0
loc 26
rs 9.4555
1
<?php
2
// phpcs:ignoreFile
3
4
namespace BEAR\Resource;
5
6
use BEAR\Resource\Exception\BadRequestException;
7
use Throwable;
8
use function call_user_func_array;
9
use function is_callable;
10
use function ucfirst;
11
12
final class PhpClassInvoker implements InvokerInterface
13
{
14
    public function __construct(
15
        private readonly NamedParameterInterface $params,
16
        private readonly ExtraMethodInvoker $extraMethod,
17
        private readonly LoggerInterface $logger,
18
    ) {
19
    }
20
21
    /**
22
     * {@inheritdoc}
23
     */
24
    public function invoke(AbstractRequest $request): ResourceObject
25
    {
26
        $callable = [$request->resourceObject, 'on' . ucfirst($request->method)];
27
        if (! is_callable($callable)) {
28
            // OPTIONS or HEAD
29
            return ($this->extraMethod)($request, $this);
30
        }
31
32
        $params = $this->params->getParameters($callable, $request->query);
33
        /** @psalm-suppress MixedAssignment */
34
        try {
35
            $response = call_user_func_array($callable, $params);
36
        } catch (Throwable $e) {
37
            if ($e::class === \TypeError::class) {
38
                throw new BadRequestException('Invalid parameter type', Code::BAD_REQUEST, $e);
39
            }
40
            throw $e;
41
        }
42
        if (! $response instanceof ResourceObject) {
43
            $request->resourceObject->body = $response;
44
            $response = $request->resourceObject;
45
        }
46
47
        ($this->logger)($response);
48
49
        return $response;
50
    }
51
}
52