Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 35
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 / 35
0.00% covered (danger)
0.00%
0 / 1
132
0.00% covered (danger)
0.00%
0 / 1
 __invoke
0.00% covered (danger)
0.00%
0 / 35
0.00% covered (danger)
0.00%
0 / 1
132
1<?php
2
3namespace BO\Zmsapi\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     * @param ServerRequestInterface $request
21     * @param \Throwable $exception
22     * @param bool $displayErrorDetails
23     * @param bool $logErrors
24     * @param bool $logErrorDetails
25     * @return ResponseInterface
26     */
27    public function __invoke(
28        ServerRequestInterface $request,
29        \Throwable $exception,
30        bool $displayErrorDetails,
31        bool $logErrors,
32        bool $logErrorDetails
33    ): ResponseInterface {
34        $response = \App::$slim->getResponseFactory()->createResponse();
35        if ($exception instanceof \Slim\Exception\HttpNotFoundException) {
36            $message = \BO\Zmsapi\Response\Message::create($request);
37            $message->meta->error = true;
38            $message->meta->message = "Could not find a resource with the given URL " . $request->getUri()->getPath();
39            $response = \BO\Slim\Render::withLastModified($response, time(), '0');
40            return Render::withJson($response, $message, 404);
41        }
42
43        $message = \BO\Zmsapi\Response\Message::create($request);
44        $message->meta->error = true;
45        $message->meta->message = $exception->getMessage();
46        $message->meta->exception = get_class($exception);
47        $message->meta->trace = '';
48        foreach (array_slice($exception->getTrace(), 0, 10) as $call) {
49            $message->meta->trace .= "\\";
50            $message->meta->trace .= isset($call['class']) ? $call['class'] : '';
51            $message->meta->trace .= "::";
52            $message->meta->trace .= isset($call['function']) ? $call['function'] : '';
53            $message->meta->trace .= " +";
54            $message->meta->trace .= isset($call['line']) ? $call['line'] : '';
55            $message->meta->trace .= "\n";
56        }
57        $message->meta->trace = Sanitizer::sanitizeStackTrace($message->meta->trace);
58
59        if (isset($exception->data)) {
60            $message->data = $exception->data;
61        }
62        $response = \BO\Slim\Render::withLastModified($response, time(), '0');
63        $status = 500;
64        if ($exception->getCode() >= 200 && $exception->getCode() <= 599) {
65            $status = $exception->getcode();
66        }
67        if ($exception->getCode() >= 500 || !$exception->getCode()) {
68            \App::$log->critical(
69                "[API] Fatal Exception: "
70                . " in " . $exception->getFile() . " +" . $exception->getLine()
71                . " -> " . $exception->getMessage()
72                . " | Trace: " . Sanitizer::sanitizeStackTrace(preg_replace("#(\s)+#", ' ', str_replace('\\', ':', $message->meta->trace)))
73            );
74        }
75        return Render::withJson($response, $message, $status);
76    }
77}