. */ namespace vierbergenlars\AuthserverExternalAccountBundle\ExternalAccount; use vierbergenlars\AuthserverExternalAccountBundle\Entity\ExternalUser; class ExternalAccountProviderManager { /** * @var ExternalAccountProviderInterface[] */ private $externalAccountProviders = []; public function addAccountProvider(ExternalAccountProviderInterface $accountProvider) { if(isset($this->externalAccountProviders[$accountProvider->getName()])) throw new \InvalidArgumentException(sprintf('Provider "%s" is already registered.', $accountProvider->getName())); $this->externalAccountProviders[$accountProvider->getName()] = $accountProvider; } /** * * @return ExternalAccountProviderInterface[] */ public function getAccountProviders() { return array_values($this->externalAccountProviders); } /** * @param ExternalUser $externalUser * @return ExternalAccountProviderInterface */ public function getProviderForExternalUser(ExternalUser $externalUser) { $provider = $externalUser->getProvider(); return $this->getProviderByName($provider); } /** * @param ExternalUser $externalUser * @return ExternalAccountProviderInterface|null */ public function getProviderForExternalUserUnsafe(ExternalUser $externalUser) { $provider = $externalUser->getProvider(); return $this->getProviderByNameUnsafe($provider); } /** * @param string $providerName * @return ExternalAccountProviderInterface */ public function getProviderByName($providerName) { if(!isset($this->externalAccountProviders[$providerName])) throw new \OutOfBoundsException(sprintf('Provider "%s" is not configured.', $providerName)); return $this->externalAccountProviders[$providerName]; } /** * @param string $providerName * @return ExternalAccountProviderInterface|null */ public function getProviderByNameUnsafe($providerName) { try { return $this->getProviderByName($providerName); } catch(\OutOfBoundsException $ex) { return new NullExternalAccountProvider($providerName); } } public function getProviderSupporting($externalProviderData) { foreach($this->externalAccountProviders as $provider) { if($provider->supports($externalProviderData)) return $provider; } throw new \OutOfBoundsException(sprintf('Can not find any provider handling data of type %s', is_object($externalProviderData)?get_class($externalProviderData):gettype($externalProviderData))); } }