Completed
Push — master ( 9ae8ae...2db751 )
by Dominik
03:39 queued 01:25
created

ErrorHandler::__invoke()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 14
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 14
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 7
nc 3
nop 3
1
<?php
2
3
namespace Chubbyphp\ErrorHandler;
4
5
use Psr\Http\Message\ServerRequestInterface as Request;
6
use Psr\Http\Message\ResponseInterface as Response;
7
8
final class ErrorHandler
9
{
10
    /**
11
     * @var ContentTypeResolverInterface
12
     */
13
    private $contentTypeResolver;
14
15
    /**
16
     * @var string
17
     */
18
    private $defaultProvider;
19
20
    /**
21
     * @var ErrorResponseProviderInterface[]
22
     */
23
    private $providers = [];
24
25
    /**
26
     * @param ContentTypeResolverInterface     $contentTypeResolver
27
     * @param string                           $defaultProvider
28
     * @param ErrorResponseProviderInterface[] $providers
29
     */
30
    public function __construct(ContentTypeResolverInterface $contentTypeResolver, $defaultProvider, array $providers)
31
    {
32
        $this->contentTypeResolver = $contentTypeResolver;
33
        $this->defaultProvider = $defaultProvider;
34
        foreach ($providers as $provider) {
35
            $this->addProvider($provider);
36
        }
37
    }
38
39
    /**
40
     * @param ErrorResponseProviderInterface $provider
41
     */
42
    private function addProvider(ErrorResponseProviderInterface $provider)
43
    {
44
        $this->providers[$provider->getContentType()] = $provider;
45
    }
46
47
    /**
48
     * @param Request    $request
49
     * @param Response   $response
50
     * @param \Exception $exception
51
     *
52
     * @return Response
53
     *
54
     * @throws \LogicException
55
     */
56
    public function __invoke(Request $request, Response $response, \Exception $exception): Response
57
    {
58
        $contentType = $this->contentTypeResolver->getContentType($request);
59
60
        if (isset($this->providers[$contentType])) {
61
            return $this->providers[$contentType]->get($request, $response, $exception);
62
        }
63
64
        if (isset($this->providers[$this->defaultProvider])) {
65
            return $this->providers[$this->defaultProvider]->get($request, $response, $exception);
66
        }
67
68
        throw new \LogicException('Default provider is missing!');
69
    }
70
}
71