Files
michaelschiemer/src/Framework/Core/Application.php
Michael Schiemer 55a330b223 Enable Discovery debug logging for production troubleshooting
- Add DISCOVERY_LOG_LEVEL=debug
- Add DISCOVERY_SHOW_PROGRESS=true
- Temporary changes for debugging InitializerProcessor fixes on production
2025-08-11 20:13:26 +02:00

118 lines
3.6 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Framework\Core;
use App\Framework\Config\TypedConfiguration;
use App\Framework\Core\Events\AfterEmitResponse;
use App\Framework\Core\Events\AfterHandleRequest;
use App\Framework\Core\Events\ApplicationBooted;
use App\Framework\Core\Events\BeforeEmitResponse;
use App\Framework\Core\Events\BeforeHandleRequest;
use App\Framework\Core\Events\EventDispatcherInterface;
use App\Framework\DI\Container;
use App\Framework\Http\MiddlewareManagerInterface;
use App\Framework\Http\Request;
use App\Framework\Http\Response;
use App\Framework\Http\ResponseEmitter;
use App\Framework\Performance\Contracts\PerformanceCollectorInterface;
use App\Framework\Performance\PerformanceCategory;
use App\Framework\Router\HttpRouter;
use DateTimeImmutable;
final readonly class Application implements ApplicationInterface
{
private MiddlewareManagerInterface $middlewareManager;
private EventDispatcherInterface $eventDispatcher;
private PerformanceCollectorInterface $performanceCollector;
public function __construct(
private Container $container,
private ResponseEmitter $responseEmitter,
private TypedConfiguration $config,
?MiddlewareManagerInterface $middlewareManager = null,
?EventDispatcherInterface $eventDispatcher = null,
?PerformanceCollectorInterface $performanceCollector = null,
) {
// Dependencies optional injizieren oder aus Container holen
$this->middlewareManager = $middlewareManager ?? $this->container->get(MiddlewareManagerInterface::class);
$this->eventDispatcher = $eventDispatcher ?? $this->container->get(EventDispatcherInterface::class);
$this->performanceCollector = $performanceCollector ?? $this->container->get(PerformanceCollectorInterface::class);
}
/**
* Führt die Anwendung aus
*/
public function run(): void
{
$this->boot();
$response = $this->handleRequest($this->container->get(Request::class));
$this->emitResponse($response);
}
/**
* Bootstrap der Anwendung
*/
private function boot(): void
{
// ApplicationBooted-Event dispatchen
$environment = $this->config->app->environment;
$version = $this->config->app->version;
$bootEvent = new ApplicationBooted(
bootTime: new DateTimeImmutable(),
environment: $environment,
version: $version
);
$this->event($bootEvent);
// Sicherstellen, dass ein Router registriert wurde
if (! $this->container->has(HttpRouter::class)) {
throw new \RuntimeException('Kritischer Fehler: Router wurde nicht initialisiert');
}
}
/**
* Verarbeitet den HTTP-Request
*/
private function handleRequest(Request $request): Response
{
$this->event(new BeforeHandleRequest());
$response = $this->performanceCollector->measure(
'handle_request',
PerformanceCategory::SYSTEM,
function () use ($request) {
return $this->middlewareManager->chain->handle($request);
}
);
#$response = $this->middlewareManager->chain->handle($request);
$this->event(new AfterHandleRequest());
return $response;
}
/**
* Gibt die HTTP-Response aus
*/
private function emitResponse(Response $response): void
{
$this->event(new BeforeEmitResponse());
$this->responseEmitter->emit($response);
$this->event(new AfterEmitResponse());
}
private function event(object $event): void
{
$this->eventDispatcher->dispatch($event);
}
}