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