67 lines
2.1 KiB
PHP
67 lines
2.1 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Bootstrap;
|
|
|
|
use App\Middleware\CorsMiddleware;
|
|
use Psr\Http\Message\ResponseInterface;
|
|
use Psr\Http\Message\ServerRequestInterface;
|
|
use Slim\App;
|
|
use Slim\Factory\AppFactory;
|
|
use Slim\Middleware\BodyParsingMiddleware;
|
|
use Slim\Middleware\ErrorMiddleware;
|
|
|
|
class AppBootstrap
|
|
{
|
|
/**
|
|
* Create and configure Slim App instance
|
|
*
|
|
* @return App
|
|
*/
|
|
public static function create(): App
|
|
{
|
|
$app = AppFactory::create();
|
|
|
|
// Add CORS middleware FIRST (will execute AFTER routing due to LIFO)
|
|
// This ensures CORS headers are added to all responses, including OPTIONS preflight
|
|
$app->add(new CorsMiddleware());
|
|
|
|
// Add body parsing middleware
|
|
$app->addBodyParsingMiddleware();
|
|
|
|
// Add routing middleware
|
|
$app->addRoutingMiddleware();
|
|
|
|
// Add error middleware
|
|
$errorMiddleware = $app->addErrorMiddleware(true, true, true);
|
|
|
|
// Set custom error handler that includes CORS headers
|
|
$errorHandler = $errorMiddleware->getDefaultErrorHandler();
|
|
$errorMiddleware->setDefaultErrorHandler(function (
|
|
ServerRequestInterface $request,
|
|
\Throwable $exception,
|
|
bool $displayErrorDetails,
|
|
bool $logErrors,
|
|
bool $logErrorDetails
|
|
) use ($errorHandler, $app): ResponseInterface {
|
|
$response = $errorHandler($request, $exception, $displayErrorDetails, $logErrors, $logErrorDetails);
|
|
|
|
// Add CORS headers to error response
|
|
$corsMiddleware = new CorsMiddleware();
|
|
return $corsMiddleware->process($request, new class($response) implements \Psr\Http\Server\RequestHandlerInterface {
|
|
private $response;
|
|
public function __construct($response) {
|
|
$this->response = $response;
|
|
}
|
|
public function handle(\Psr\Http\Message\ServerRequestInterface $request): \Psr\Http\Message\ResponseInterface {
|
|
return $this->response;
|
|
}
|
|
});
|
|
});
|
|
|
|
return $app;
|
|
}
|
|
}
|
|
|