execute( $request ?? Request::createFromGlobals(), send: true, ); } public function handle(Request $request): Response { return $this->execute($request, send: false); } private function execute(Request $request, bool $send): Response { $scope = null; $outcome = ExecutionOutcome::incomplete(); try { $scope = $this->kernel->beginExecution(ExecutionDescriptor::http()); $response = $this->pipeline()->handle($request); $outcome = ExecutionOutcome::success($response); if ($send) { $response->send(); } return $response; } catch (\Throwable $error) { $response = $this->errorResponse($error); $outcome = ExecutionOutcome::failure($error, $response); if ($send) { $response->send(); } return $response; } finally { if ($scope !== null) { $this->kernel->terminateExecution($scope, $outcome); } } } private function pipeline(): MiddlewarePipeline { $pipeline = new MiddlewarePipeline($this->kernel->container()); $pipeline->pipe(TenantMiddleware::class); $pipeline->pipe(FirewallMiddleware::class); $pipeline->pipe(AuthenticationMiddleware::class); $pipeline->pipe(RouterMiddleware::class); return $pipeline; } private function errorResponse(\Throwable $error): Response { error_log(sprintf( 'Application error: %s in %s:%d', $error->getMessage(), $error->getFile(), $error->getLine(), )); $content = $this->debug ? '
' . htmlspecialchars((string) $error) . '' : 'An error occurred. Please try again later.'; return new Response($content, Response::HTTP_INTERNAL_SERVER_ERROR, [ 'Content-Type' => 'text/html; charset=UTF-8', ]); } }