Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 41
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
ErrorHandler
0.00% covered (danger)
0.00%
0 / 41
0.00% covered (danger)
0.00%
0 / 1
110
0.00% covered (danger)
0.00%
0 / 1
 __invoke
0.00% covered (danger)
0.00%
0 / 41
0.00% covered (danger)
0.00%
0 / 1
110
1<?php
2
3namespace BO\Zmsbackend\Helper;
4
5use BO\Slim\Render;
6use BO\Slim\Helper\Sanitizer;
7use Psr\Http\Message\ResponseInterface;
8use Psr\Http\Message\ServerRequestInterface;
9use Slim\Interfaces\ErrorHandlerInterface;
10
11/**
12 *
13 * @SuppressWarnings(CouplingBetweenObjects)
14 */
15class ErrorHandler implements ErrorHandlerInterface
16{
17    /**
18     * @SuppressWarnings("PMD.UnusedFormalParameter")
19     * @SuppressWarnings(Complexity)
20     */
21    #[\Override]
22    public function __invoke(
23        ServerRequestInterface $request,
24        \Throwable $exception,
25        bool $displayErrorDetails,
26        bool $logErrors,
27        bool $logErrorDetails
28    ): ResponseInterface {
29        $response = \App::$slim->getResponseFactory()->createResponse();
30        if ($exception instanceof \Slim\Exception\HttpNotFoundException) {
31            $message = \BO\Zmsbackend\Api\Response\Message::create($request);
32            $message->meta['error'] = true;
33            $message->meta['message'] = "Could not find a resource with the given URL " . $request->getUri()->getPath();
34            $response = \BO\Slim\Render::withLastModified($response, time(), '0');
35            return Render::withJson($response, $message, 404);
36        }
37
38        $message = \BO\Zmsbackend\Api\Response\Message::create($request);
39        $message->meta['error'] = true;
40        $message->meta['message'] = $exception->getMessage();
41        $message->meta['exception'] = get_class($exception);
42        $trace = '';
43        foreach (array_slice($exception->getTrace(), 0, 10) as $call) {
44            $trace .= "\\";
45            $trace .= $call['class'] ?? '';
46            $trace .= "::";
47            $trace .= $call['function'] ?? '';
48            $trace .= " +";
49            $trace .= isset($call['line']) ? (string) $call['line'] : '';
50            $trace .= "\n";
51        }
52        $trace = Sanitizer::sanitizeStackTrace($trace);
53        $message->meta['trace'] = $trace;
54
55        $exceptionVars = get_object_vars($exception);
56        if (array_key_exists('data', $exceptionVars)) {
57            $message->data = $exceptionVars['data'];
58        }
59        $response = \BO\Slim\Render::withLastModified($response, time(), '0');
60        $code = (int) $exception->getCode();
61        $status = 500;
62        if ($code >= 200 && $code <= 599) {
63            $status = $code;
64        }
65        if ($code >= 500 || $code === 0) {
66            $collapsedTrace = preg_replace("#(\s)+#", ' ', str_replace('\\', ':', $trace));
67            \App::$log->critical(
68                "[API] Fatal Exception: "
69                . " in " . $exception->getFile() . " +" . $exception->getLine()
70                . " -> " . $exception->getMessage()
71                . " | Trace: " . Sanitizer::sanitizeStackTrace(
72                    is_string($collapsedTrace) ? $collapsedTrace : $trace
73                )
74            );
75        }
76        return Render::withJson($response, $message, $status);
77    }
78}