diff --git a/api/html/index.php b/api/html/index.php
index c9e6a2f..f5df465 100644
--- a/api/html/index.php
+++ b/api/html/index.php
@@ -5,12 +5,10 @@ $dotenv = Dotenv\Dotenv::createImmutable(dirname(__DIR__));
$dotenv->load();
use DI\Container;
-use Psr\Http\Message\ServerRequestInterface;
-use Psr\Log\LoggerInterface;
-use Slim\Exception\HttpException;
use Slim\Factory\AppFactory;
use Slim\Routing\RouteCollectorProxy;
use TorstenHettstedt\TimekeepingApi\Controller\WorkingHoursController;
+use TorstenHettstedt\TimekeepingApi\Middleware\ErrorHandler;
use TorstenHettstedt\TimekeepingApi\Middleware\JsonBodyParserMiddleware;
$container = new Container();
@@ -53,40 +51,7 @@ $app->group('/working-hours', function (RouteCollectorProxy $group) {
});
});
-
-// Define Custom Error Handler
-$customErrorHandler = function (
- ServerRequestInterface $request,
- Throwable $exception,
- bool $displayErrorDetails,
- bool $logErrors,
- bool $logErrorDetails,
- ?LoggerInterface $logger = null
-) use ($app) {
- if ($logger !== null && $logErrors === true) {
- $logger->error($exception->getMessage());
- }
- $payload = [
- 'timestamp' => date('Y-m-d\TH:m:sP'),
- 'status' => $exception->getCode(),
- "error" => '',
- 'message' => $exception->getMessage(),
- 'path' => $exception->getFile()
- ];
-
- if ($exception instanceof HttpException) {
- $payload['error'] = $exception->getTitle();
- }
-
- $response = $app->getResponseFactory()->createResponse($exception->getCode());
- $response->getBody()->write(
- json_encode($payload, JSON_UNESCAPED_UNICODE)
- );
-
- return $response;
-};
-
$errorMiddleware = $app->addErrorMiddleware(true, true, true);
-$errorMiddleware->setDefaultErrorHandler($customErrorHandler);
+$errorMiddleware->setDefaultErrorHandler(new ErrorHandler($app));
$app->run();
\ No newline at end of file
diff --git a/api/src/Middleware/ErrorHandler.php b/api/src/Middleware/ErrorHandler.php
new file mode 100644
index 0000000..709ab8a
--- /dev/null
+++ b/api/src/Middleware/ErrorHandler.php
@@ -0,0 +1,83 @@
+app = $app;
+ }
+
+ /**
+ * @param Throwable $exception
+ *
+ * @return mixed[]
+ */
+ protected function buildJsonArray(Throwable $exception): array
+ {
+ $payload = [
+ 'timestamp' => date('Y-m-d\TH:m:sP'),
+ 'status' => $exception->getCode(),
+ "error" => '',
+ 'message' => $exception->getMessage(),
+ 'path' => $exception->getFile()
+ ];
+
+ if ($exception instanceof HttpException) {
+ $payload['error'] = $exception->getTitle();
+ }
+
+ return $payload;
+ }
+
+ /**
+ * @param ServerRequestInterface $request
+ * @param Throwable $exception
+ * @param bool $displayErrorDetails
+ * @param bool $logErrors
+ * @param bool $logErrorDetails
+ * @param LoggerInterface|null $logger
+ *
+ * @return ResponseInterface
+ */
+ public function __invoke(
+ ServerRequestInterface $request,
+ Throwable $exception,
+ bool $displayErrorDetails,
+ bool $logErrors,
+ bool $logErrorDetails,
+ ?LoggerInterface $logger = null
+ ): ResponseInterface
+ {
+ if ($logger !== null && $logErrors === true) {
+ $logger->error($exception->getMessage());
+ }
+
+ $payload = $this->buildJsonArray($exception);
+
+ $response = $this->app->getResponseFactory()->createResponse($exception->getCode());
+ $response->getBody()->write(
+ json_encode($payload, JSON_UNESCAPED_UNICODE)
+ );
+
+ return $response;
+ }
+
+}
\ No newline at end of file