vendor/kreait/firebase-bundle/src/DependencyInjection/FirebaseExtension.php line 91

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Kreait\Firebase\Symfony\Bundle\DependencyInjection;
  4. use Kreait\Firebase;
  5. use Kreait\Firebase\Symfony\Bundle\DependencyInjection\Factory\ProjectFactory;
  6. use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
  7. use Symfony\Component\Config\FileLocator;
  8. use Symfony\Component\DependencyInjection\ContainerBuilder;
  9. use Symfony\Component\DependencyInjection\Extension\Extension;
  10. use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
  11. use Symfony\Component\DependencyInjection\Reference;
  12. class FirebaseExtension extends Extension
  13. {
  14.     public function load(array $configsContainerBuilder $container): void
  15.     {
  16.         $configuration $this->getConfiguration($configs$container);
  17.         $config $this->processConfiguration($configuration$configs);
  18.         $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
  19.         $loader->load('firebase.xml');
  20.         $projectConfigurations $config['projects'] ?? [];
  21.         $projectConfigurationsCount \count($projectConfigurations);
  22.         $this->assertThatOnlyOneDefaultProjectExists($projectConfigurations);
  23.         foreach ($projectConfigurations as $projectName => $projectConfiguration) {
  24.             if (=== $projectConfigurationsCount) {
  25.                 $projectConfiguration['default'] = $projectConfiguration['default'] ?? true;
  26.             }
  27.             $this->processProjectConfiguration($projectName$projectConfiguration$container);
  28.         }
  29.     }
  30.     private function processProjectConfiguration(string $name, array $configContainerBuilder $container): void
  31.     {
  32.         $this->registerService($name.'.database'$configFirebase\Database::class, Firebase\Contract\Database::class, $container'createDatabase');
  33.         $this->registerService($name.'.auth'$configFirebase\Auth::class, Firebase\Contract\Auth::class, $container'createAuth');
  34.         $this->registerService($name.'.storage'$configFirebase\Storage::class, Firebase\Contract\Storage::class, $container'createStorage');
  35.         $this->registerService($name.'.remote_config'$configFirebase\RemoteConfig::class, Firebase\Contract\RemoteConfig::class, $container'createRemoteConfig');
  36.         $this->registerService($name.'.messaging'$configFirebase\Messaging::class, Firebase\Contract\Messaging::class, $container'createMessaging');
  37.         $this->registerService($name.'.firestore'$configFirebase\Firestore::class, Firebase\Contract\Firestore::class, $container'createFirestore');
  38.         $this->registerService($name.'.dynamic_links'$configFirebase\DynamicLinks::class, Firebase\Contract\DynamicLinks::class, $container'createDynamicLinksService');
  39.     }
  40.     public function getAlias(): string
  41.     {
  42.         return 'kreait_firebase';
  43.     }
  44.     public function getConfiguration(array $configContainerBuilder $container): Configuration
  45.     {
  46.         return new Configuration($this->getAlias());
  47.     }
  48.     private function registerService(string $name, array $configstring $classstring $contractContainerBuilder $containerstring $method 'create'): void
  49.     {
  50.         $projectServiceId \sprintf('%s.%s'$this->getAlias(), $name);
  51.         $isPublic $config['public'];
  52.         $factory $container->getDefinition(ProjectFactory::class);
  53.         if ($config['verifier_cache'] ?? null) {
  54.             $factory->addMethodCall('setVerifierCache', [new Reference($config['verifier_cache'])]);
  55.         }
  56.         if ($config['auth_token_cache'] ?? null) {
  57.             $factory->addMethodCall('setAuthTokenCache', [new Reference($config['auth_token_cache'])]);
  58.         }
  59.         if ($config['http_request_logger'] ?? null) {
  60.             $factory->addMethodCall('setHttpRequestLogger', [new Reference($config['http_request_logger'])]);
  61.         }
  62.         if ($config['http_request_debug_logger'] ?? null) {
  63.             $factory->addMethodCall('setHttpRequestDebugLogger', [new Reference($config['http_request_debug_logger'])]);
  64.         }
  65.         $container->register($projectServiceId$contract)
  66.             ->setFactory([$factory$method])
  67.             ->addArgument($config)
  68.             ->setPublic($isPublic);
  69.         if ($config['default'] ?? false) {
  70.             $container->setAlias($contract$projectServiceId)->setPublic($isPublic);
  71.             $container->setAlias($class$projectServiceId)->setPublic($isPublic)->setDeprecated();
  72.         }
  73.     }
  74.     private function assertThatOnlyOneDefaultProjectExists(array $projectConfigurations): void
  75.     {
  76.         $count 0;
  77.         foreach ($projectConfigurations as $projectConfiguration) {
  78.             if ($projectConfiguration['default'] ?? false) {
  79.                 ++$count;
  80.             }
  81.             if ($count 1) {
  82.                 throw new InvalidConfigurationException('Only one project can be set as default.');
  83.             }
  84.         }
  85.     }
  86. }