|null $settings Optional override (tests pass in fixtures). */ public static function build(?array $settings = null): ContainerInterface { $settings ??= require __DIR__ . '/../../config/settings.php'; $builder = new ContainerBuilder(); $builder->useAutowiring(true); $builder->addDefinitions([ 'settings' => $settings, 'settings.db' => $settings['db'], 'settings.ui_service_token' => $settings['ui_service_token'] ?? '', 'settings.app_env' => $settings['app_env'] ?? 'production', 'settings.log_level' => $settings['log_level'] ?? \Monolog\Level::Info, 'settings.oidc_default_role' => $settings['oidc_default_role'] ?? Role::Viewer, ConnectionFactory::class => factory(static function (ContainerInterface $c): ConnectionFactory { /** @var array{driver: string, sqlite_path: string, mysql_host: string, mysql_port: int, mysql_database: string, mysql_username: string, mysql_password: string} $db */ $db = $c->get('settings.db'); return new ConnectionFactory($db); }), Connection::class => factory(static function (ContainerInterface $c): Connection { /** @var ConnectionFactory $factory */ $factory = $c->get(ConnectionFactory::class); return $factory->create(); }), LoggerInterface::class => factory(static function (ContainerInterface $c): LoggerInterface { $logger = new Logger('api'); /** @var \Monolog\Level $level */ $level = $c->get('settings.log_level'); $handler = new StreamHandler('php://stdout', $level); $handler->setFormatter(new JsonFormatter()); $logger->pushHandler($handler); return $logger; }), ResponseFactoryInterface::class => autowire(ResponseFactory::class), TokenHasher::class => autowire(), TokenIssuer::class => autowire(), TokenRepository::class => autowire(), RoleMappingRepository::class => autowire(), UserRepository::class => autowire(), ServiceTokenBootstrap::class => autowire(), TokenAuthenticationMiddleware::class => autowire(), ImpersonationMiddleware::class => autowire(), JsonErrorHandler::class => factory(static function (ContainerInterface $c): JsonErrorHandler { /** @var ResponseFactoryInterface $factory */ $factory = $c->get(ResponseFactoryInterface::class); /** @var LoggerInterface $logger */ $logger = $c->get(LoggerInterface::class); return new JsonErrorHandler( $factory, $logger, $c->get('settings.app_env') === 'development', ); }), AuthController::class => factory(static function (ContainerInterface $c): AuthController { /** @var Role|null $role */ $role = $c->get('settings.oidc_default_role'); /** @var UserRepository $users */ $users = $c->get(UserRepository::class); return new AuthController($users, $role ?? Role::Viewer); }), MeController::class => autowire(), ]); return $builder->build(); } }