Passed
Pull Request — master (#332)
by Alexander
02:42
created

ExceptionResponder::process()   A

Complexity

Conditions 6
Paths 6

Size

Total Lines 17
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 42

Importance

Changes 3
Bugs 0 Features 0
Metric Value
eloc 10
c 3
b 0
f 0
dl 0
loc 17
ccs 0
cts 11
cp 0
rs 9.2222
cc 6
nc 6
nop 2
crap 42
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Yii\Web\Middleware;
6
7
use Psr\Http\Message\ResponseFactoryInterface;
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 Yiisoft\Injector\Injector;
13
14
class ExceptionResponder implements MiddlewareInterface
15
{
16
    private array $exceptionMap;
17
    private ResponseFactoryInterface $responseFactory;
18
    private Injector $injector;
19
20
    /**
21
     * @param int[]|callable[] $exceptionMap Closure must return ResponseInterface
22
     * @psalm-param array{string, int|callable}
23
     */
24
    public function __construct(array $exceptionMap, ResponseFactoryInterface $responseFactory, Injector $injector)
25
    {
26
        $this->exceptionMap = $exceptionMap;
27
        $this->responseFactory = $responseFactory;
28
        $this->injector = $injector;
29
    }
30
31
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
32
    {
33
        try {
34
            return $handler->handle($request);
35
        } catch (\Throwable $t) {
36
            foreach ($this->exceptionMap as $exceptionType => $responseHandler) {
37
                if ($t instanceof $exceptionType) {
38
                    if (is_int($responseHandler)) {
39
                        return $this->responseFactory->createResponse($responseHandler);
40
                    }
41
42
                    if (is_callable($responseHandler)) {
43
                        return $this->injector->invoke($responseHandler);
44
                    }
45
                }
46
            }
47
            throw $t;
48
        }
49
    }
50
}
51