Code Duplication    Length = 93-93 lines in 2 locations

src/AdvancedErrorHandler.php 1 location

@@ 12-104 (lines=93) @@
9
use Psr\Log\LoggerInterface;
10
use Psr\Log\NullLogger;
11
12
final class AdvancedErrorHandler implements ErrorHandlerInterface
13
{
14
    /**
15
     * @var ContentTypeResolverInterface
16
     */
17
    private $contentTypeResolver;
18
19
    /**
20
     * @var ErrorResponseProviderInterface
21
     */
22
    private $fallbackProvider;
23
24
    /**
25
     * @var ErrorResponseProviderInterface[]
26
     */
27
    private $providers = [];
28
29
    /**
30
     * @var LoggerInterface
31
     */
32
    private $logger;
33
34
    /**
35
     * @param ContentTypeResolverInterface   $contentTypeResolver
36
     * @param ErrorResponseProviderInterface $fallbackProvider
37
     * @param array                          $providers
38
     * @param LoggerInterface|null           $logger
39
     */
40
    public function __construct(
41
        ContentTypeResolverInterface $contentTypeResolver,
42
        ErrorResponseProviderInterface $fallbackProvider,
43
        array $providers = [],
44
        LoggerInterface $logger = null
45
    ) {
46
        $this->contentTypeResolver = $contentTypeResolver;
47
        $this->fallbackProvider = $fallbackProvider;
48
        $this->addProvider($fallbackProvider);
49
        foreach ($providers as $provider) {
50
            $this->addProvider($provider);
51
        }
52
        $this->logger = $logger ?? new NullLogger();
53
    }
54
55
    /**
56
     * @param ErrorResponseProviderInterface $provider
57
     */
58
    private function addProvider(ErrorResponseProviderInterface $provider)
59
    {
60
        $this->providers[$provider->getContentType()] = $provider;
61
    }
62
63
    /**
64
     * @param Request    $request
65
     * @param Response   $response
66
     * @param \Exception $exception
67
     *
68
     * @return Response
69
     *
70
     * @throws \LogicException
71
     */
72
    public function __invoke(Request $request, Response $response, \Exception $exception): Response
73
    {
74
        $contentType = $this->contentTypeResolver->getContentType($request, array_keys($this->providers));
75
76
        $this->logException($exception);
77
78
        if (isset($this->providers[$contentType])) {
79
            return $this->providers[$contentType]->get($request, $response, $exception);
80
        }
81
82
        return $this->fallbackProvider->get($request, $response, $exception);
83
    }
84
85
    /**
86
     * @param \Exception $exception
87
     */
88
    private function logException(\Exception $exception)
89
    {
90
        if ($exception instanceof HttpException) {
91
            $this->logger->warning(
92
                'error-handler: {code} {message}',
93
                ['status' => $exception->getCode(), 'message' => $exception->getMessage()]
94
            );
95
96
            return;
97
        }
98
99
        $this->logger->error(
100
            'error-handler: {code} {message}',
101
            ['status' => 500, 'message' => $exception->getMessage()]
102
        );
103
    }
104
}
105

src/Slim/AdvancedErrorHandler.php 1 location

@@ 18-110 (lines=93) @@
15
/**
16
 * @deprecated use Chubbyphp\ErrorHandler\AdvancedErrorHandler
17
 */
18
final class AdvancedErrorHandler implements ErrorHandlerInterface
19
{
20
    /**
21
     * @var ContentTypeResolverInterface
22
     */
23
    private $contentTypeResolver;
24
25
    /**
26
     * @var ErrorResponseProviderInterface
27
     */
28
    private $fallbackProvider;
29
30
    /**
31
     * @var ErrorResponseProviderInterface[]
32
     */
33
    private $providers = [];
34
35
    /**
36
     * @var LoggerInterface
37
     */
38
    private $logger;
39
40
    /**
41
     * @param ContentTypeResolverInterface   $contentTypeResolver
42
     * @param ErrorResponseProviderInterface $fallbackProvider
43
     * @param array                          $providers
44
     * @param LoggerInterface|null           $logger
45
     */
46
    public function __construct(
47
        ContentTypeResolverInterface $contentTypeResolver,
48
        ErrorResponseProviderInterface $fallbackProvider,
49
        array $providers = [],
50
        LoggerInterface $logger = null
51
    ) {
52
        $this->contentTypeResolver = $contentTypeResolver;
53
        $this->fallbackProvider = $fallbackProvider;
54
        $this->addProvider($fallbackProvider);
55
        foreach ($providers as $provider) {
56
            $this->addProvider($provider);
57
        }
58
        $this->logger = $logger ?? new NullLogger();
59
    }
60
61
    /**
62
     * @param ErrorResponseProviderInterface $provider
63
     */
64
    private function addProvider(ErrorResponseProviderInterface $provider)
65
    {
66
        $this->providers[$provider->getContentType()] = $provider;
67
    }
68
69
    /**
70
     * @param Request    $request
71
     * @param Response   $response
72
     * @param \Exception $exception
73
     *
74
     * @return Response
75
     *
76
     * @throws \LogicException
77
     */
78
    public function __invoke(Request $request, Response $response, \Exception $exception): Response
79
    {
80
        $contentType = $this->contentTypeResolver->getContentType($request, array_keys($this->providers));
81
82
        $this->logException($exception);
83
84
        if (isset($this->providers[$contentType])) {
85
            return $this->providers[$contentType]->get($request, $response, $exception);
86
        }
87
88
        return $this->fallbackProvider->get($request, $response, $exception);
89
    }
90
91
    /**
92
     * @param \Exception $exception
93
     */
94
    private function logException(\Exception $exception)
95
    {
96
        if ($exception instanceof HttpException) {
97
            $this->logger->warning(
98
                'error-handler: {code} {message}',
99
                ['status' => $exception->getCode(), 'message' => $exception->getMessage()]
100
            );
101
102
            return;
103
        }
104
105
        $this->logger->error(
106
            'error-handler: {code} {message}',
107
            ['status' => 500, 'message' => $exception->getMessage()]
108
        );
109
    }
110
}
111