registeredProviders[$type][$identifier] = $class; } /** * Unregister a provider */ public function unregister(string $type, string $identifier): void { unset($this->registeredProviders[$type][$identifier]); unset($this->resolvedProviders[$type][$identifier]); } /** * Resolve a provider by ID */ public function resolve(string $type, string $identifier): ?ProviderInterface { if (isset($this->resolvedProviders[$type][$identifier])) { return $this->resolvedProviders[$type][$identifier]; } if (!isset($this->registeredProviders[$type][$identifier])) { return null; } try { $provider = Server::runtimeContainer()->get($this->registeredProviders[$type][$identifier]); $this->resolvedProviders[$type][$identifier] = $provider; return $provider; } catch (\Exception $e) { error_log("Failed to resolve provider {$identifier}: " . $e->getMessage()); return null; } } /** * Resolve multiple providers * * @param array|null $filter Optional list of provider IDs to return * @return array */ public function providers(string $type, ?array $filter = null): array { $requestedProviders = $filter ?? array_keys($this->registeredProviders[$type] ?? []); $result = []; foreach ($requestedProviders as $identifier) { $provider = $this->resolve($type, $identifier); if ($provider !== null) { $result[$identifier] = $provider; } } return $result; } }