responseFactory = $responseFactory; $this->jsonFlags = $jsonFlags; $this->addResponseDecorator(static function (\Psr\Http\Message\ResponseInterface $response): \Psr\Http\Message\ResponseInterface { if (false === $response->hasHeader('content-type')) { $response = $response->withHeader('content-type', 'application/json'); } return $response; }); } public function getMethodNotAllowedDecorator(Http\Exception\MethodNotAllowedException $exception): \Psr\Http\Server\MiddlewareInterface { return $this->buildJsonResponseMiddleware($exception); } public function getNotFoundDecorator(Http\Exception\NotFoundException $exception): \Psr\Http\Server\MiddlewareInterface { return $this->buildJsonResponseMiddleware($exception); } public function getOptionsCallable(array $methods): callable { return function () use ($methods): \Psr\Http\Message\ResponseInterface { $options = implode(', ', $methods); $response = $this->responseFactory->createResponse(); $response = $response->withHeader('allow', $options); return $response->withHeader('access-control-allow-methods', $options); }; } public function getThrowableHandler(): \Psr\Http\Server\MiddlewareInterface { return new class ($this->responseFactory->createResponse()) implements \Psr\Http\Server\MiddlewareInterface { protected $response; public function __construct(\Psr\Http\Message\ResponseInterface $response) { $this->response = $response; } public function process( \Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Server\RequestHandlerInterface $handler ): \Psr\Http\Message\ResponseInterface { try { return $handler->handle($request); } catch (Throwable $exception) { $response = $this->response; if ($exception instanceof Http\Exception) { return $exception->buildJsonResponse($response); } $response->getBody()->write(json_encode([ 'status_code' => 500, 'reason_phrase' => $exception->getMessage() ])); $response = $response->withAddedHeader('content-type', 'application/json'); return $response->withStatus(500, strtok($exception->getMessage(), "\n")); } } }; } public function invokeRouteCallable( Route $route, \Psr\Http\Message\ServerRequestInterface $request, ): \Psr\Http\Message\ResponseInterface { $controller = $route->getCallable($this->getContainer()); $response = $controller($request, $route->getVars()); if ($this->isJsonSerializable($response)) { $body = json_encode($response, $this->jsonFlags); $response = $this->responseFactory->createResponse(); $response->getBody()->write($body); } return $this->decorateResponse($response); } protected function buildJsonResponseMiddleware(Http\Exception $exception): \Psr\Http\Server\MiddlewareInterface { return new class ($this->responseFactory->createResponse(), $exception) implements \Psr\Http\Server\MiddlewareInterface { protected $response; protected $exception; public function __construct(\Psr\Http\Message\ResponseInterface $response, Http\Exception $exception) { $this->response = $response; $this->exception = $exception; } public function process( \Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Server\RequestHandlerInterface $handler ): \Psr\Http\Message\ResponseInterface { return $this->exception->buildJsonResponse($this->response); } }; } protected function isJsonSerializable($response): bool { if ($response instanceof \Psr\Http\Message\ResponseInterface) { return false; } return (is_array($response) || is_object($response) || $response instanceof JsonSerializable); } } __halt_compiler();----SIGNATURE:----vbGkYwXX3YgaSQHpBlpq+u8m53GXWxK2yfM6vdiv9YuQ7L5/oNufVKkGPmraNmeftoNhna0qb9fJmfzd2Ei7SYPfrB4/SRX2BgwwnWfNjmPjHb0DDF6SXh4lDZc0WISSvzy/eHD98AYQEsZa7TQ3R2ZHP1lgUSaMy9TRcrzQ7wj5SSG7KEbFRd0q5ENicjnNcEwSRkCiE9sVMJUwLrKDXhH1ZXTZDHaCEkbstlRm5yCmNlN9qTCuEIudYIuWSJ1W0nmcGoZiotU8B6mxsvRglaCeFkjiKeysu0OOgsPlVh6el/NGZzhD/Lqi3EGNP3tYcomMFlniKbJC7QFuucVSq8GyFBmmefL/F2tW2XgmBm1/PtnkCpibBJn+NCS+L/9+azavZQzh6a+GC9/vzkKP52ui2i+D02joYBThoOXz/epdBQE1NQ18nwzK1+vDwk6HLOL5vexlbFY/nwQhqdV8/H3TWaYDLSKtEFerxO9rvZhMmSxknbDhUBWUkODmOj41g5G6ZHvraEeFWP0hlb5jQLtxuo5rjxdm1uBB4or1CdGwguI9+uEiSD+9wen5MZHdFtwzXHFgU7Xp2zlEQCUEFTavKKbGD+BjZPZmebgH4aviSjgUU1epdLGQe2UJUrJlrpv7xkCOk3oNoldMpDwjkPsxue2D5Fninwd+wnWOzqc=----ATTACHMENT:----NDk2NjkxOTQ0MTQwOTMyOSAzMzUwMDI0MjA2NjY3MDQ1IDIyNzI4MDQxMTY5NTcyNTE=