set(SettingServicesFactory::class, static fn (AppContainer $c): SettingServicesFactory => new SettingServicesFactory( $c->get(SettingRepositoryFactory::class) )); // Audit interfaces are NOT registered here — they are set AFTER module registrars // in registerContainer.php so the audit module can provide real implementations. // If the audit module is disabled, null implementations are used as fallback. $container->set(SecurityServicesFactory::class, static fn (AppContainer $c): SecurityServicesFactory => new SecurityServicesFactory( $c->get(SecurityRepositoryFactory::class) )); $container->set(MailServicesFactory::class, static fn (AppContainer $c): MailServicesFactory => new MailServicesFactory( $c->get(MailRepositoryFactory::class), $c->get(SettingServicesFactory::class)->createSettingsSmtpGateway() )); $container->set(BrandingServicesFactory::class, static fn (AppContainer $c): BrandingServicesFactory => new BrandingServicesFactory( $c->get(SettingServicesFactory::class)->createSettingsAppGateway() )); $container->set(CustomFieldServicesFactory::class, static fn (AppContainer $c): CustomFieldServicesFactory => new CustomFieldServicesFactory( $c->get(TenantRepository::class), $c->get(TenantScopeService::class), $c->get(CustomFieldRepositoryFactory::class) )); $container->set(TenantServicesFactory::class, static fn (AppContainer $c): TenantServicesFactory => new TenantServicesFactory( $c->get(PermissionService::class), $c->get(TenantRepositoryFactory::class) )); $container->set(ImportServicesFactory::class, static fn (AppContainer $c): ImportServicesFactory => new ImportServicesFactory( $c->get(UserServicesFactory::class), $c->get(AccessServicesFactory::class), $c->get(SettingServicesFactory::class), $c->get(DirectoryServicesFactory::class), $c->get(ImportAuditInterface::class), $c->get(TenantScopeService::class), $c->get(SessionStoreInterface::class) )); $container->set(SchedulerServicesFactory::class, static fn (AppContainer $c): SchedulerServicesFactory => new SchedulerServicesFactory( $c->get(UserServicesFactory::class), $c->get(AuditRecorderInterface::class), $c->get(DatabaseSessionRepository::class), $c->get(SchedulerRepositoryFactory::class), $c )); $container->set(DirectoryServicesFactory::class, static fn (AppContainer $c): DirectoryServicesFactory => new DirectoryServicesFactory( $c->get(UserServicesFactory::class), $c->get(AuditRecorderInterface::class), $c->get(DirectoryRepositoryFactory::class), $c->get(DirectoryGatewayFactory::class) )); $container->set(DirectoryGatewayFactory::class, static fn (AppContainer $c): DirectoryGatewayFactory => new DirectoryGatewayFactory( $c->get(SettingServicesFactory::class), $c->get(TenantScopeService::class) )); $container->set(AccessServicesFactory::class, static fn (AppContainer $c): AccessServicesFactory => new AccessServicesFactory( $c->get(AccessRepositoryFactory::class), $c->get(AccessGatewayFactory::class), // Wrapped in a second closure to break the circular dependency: // AccessServicesFactory <-> AccessPolicyFactory via PermissionService. static fn (): AccessPolicyFactory => $c->get(AccessPolicyFactory::class) )); $container->set(AccessGatewayFactory::class, static fn (AppContainer $c): AccessGatewayFactory => new AccessGatewayFactory( $c->get(AccessRepositoryFactory::class), $c->get(AuditRecorderInterface::class), $c->get(SessionStoreInterface::class) )); $container->set(AccessPolicyFactory::class, static fn (AppContainer $c): AccessPolicyFactory => new AccessPolicyFactory( $c->get(PermissionService::class), $c->get(TenantScopeService::class), $c->has(ModuleRegistry::class) ? $c->get(ModuleRegistry::class) : null, static fn (string $class): ?object => ModuleClassResolver::resolve($c, $class) )); $container->set(UserGatewayFactory::class, static fn (AppContainer $c): UserGatewayFactory => new UserGatewayFactory( $c->get(AccessServicesFactory::class), $c->get(SettingServicesFactory::class), $c->get(TenantScopeService::class), $c->get(DirectoryRepositoryFactory::class), )); $container->set(UserServicesFactory::class, static fn (AppContainer $c): UserServicesFactory => new UserServicesFactory( $c->get(AuditRecorderInterface::class), $c->get(UserLifecycleAuditInterface::class), $c->get(UserRepositoryFactory::class), $c->get(UserGatewayFactory::class), $c->get(DatabaseSessionRepository::class), // Wrapped in a closure to break circular dependency: // UserServicesFactory -> AssignableRoleService -> RoleRepository -> DirectoryServicesFactory -> UserServicesFactory static fn (): AssignableRoleService => $c->get(AssignableRoleService::class), $c->has(ModuleEventDispatcher::class) ? $c->get(ModuleEventDispatcher::class) : null )); $container->set(AuthGatewayFactory::class, static fn (AppContainer $c): AuthGatewayFactory => new AuthGatewayFactory( $c->get(AuthRepositoryFactory::class), $c->get(AccessServicesFactory::class), $c->get(SettingServicesFactory::class), $c->get(TenantScopeService::class) )); $container->set(AuthServicesFactory::class, static fn (AppContainer $c): AuthServicesFactory => new AuthServicesFactory( $c->get(UserServicesFactory::class), $c->get(AuditRecorderInterface::class), $c->get(MailServicesFactory::class), $c->get(AuthRepositoryFactory::class), $c->get(AuthGatewayFactory::class), $c->get(DatabaseSessionRepository::class), $c->get(SessionStoreInterface::class), $c->get(CookieStoreInterface::class), $c->get(RequestRuntimeInterface::class), $c )); } }