vendor/kreait/firebase-bundle/DependencyInjection/FirebaseExtension.php line 66

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. use Throwable;
  13. class FirebaseExtension extends Extension
  14. {
  15.     /**
  16.      * @param array $configs
  17.      * @param ContainerBuilder $container
  18.      *
  19.      * @throws Throwable
  20.      */
  21.     public function load(array $configsContainerBuilder $container)
  22.     {
  23.         $configuration $this->getConfiguration($configs$container);
  24.         $config $this->processConfiguration($configuration$configs);
  25.         $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
  26.         $loader->load('firebase.xml');
  27.         $projectConfigurations $config['projects'] ?? [];
  28.         $projectConfigurationsCount count($projectConfigurations);
  29.         $this->assertThatOnlyOneDefaultProjectExists($projectConfigurations);
  30.         foreach ($projectConfigurations as $projectName => $projectConfiguration) {
  31.             if (=== $projectConfigurationsCount) {
  32.                 $projectConfiguration['default'] = $projectConfiguration['default'] ?? true;
  33.             }
  34.             $this->processProjectConfiguration($projectName$projectConfiguration$container);
  35.         }
  36.     }
  37.     private function processProjectConfiguration(string $name, array $configContainerBuilder $container)
  38.     {
  39.         $this->registerService($name.'.database'$configFirebase\Database::class, $container'createDatabase');
  40.         $this->registerService($name.'.auth'$configFirebase\Auth::class, $container'createAuth');
  41.         $this->registerService($name.'.storage'$configFirebase\Storage::class, $container'createStorage');
  42.         $this->registerService($name.'.remote_config'$configFirebase\RemoteConfig::class, $container'createRemoteConfig');
  43.         $this->registerService($name.'.messaging'$configFirebase\Messaging::class, $container'createMessaging');
  44.         $this->registerService($name.'.firestore'$configFirebase\Firestore::class, $container'createFirestore');
  45.         $this->registerService($name.'.dynamic_links'$configFirebase\DynamicLinks::class, $container'createDynamicLinksService');
  46.         $this->registerService($name$configFirebase::class, $container'create');
  47.     }
  48.     public function getAlias(): string
  49.     {
  50.         return 'kreait_firebase';
  51.     }
  52.     public function getConfiguration(array $configContainerBuilder $container): Configuration
  53.     {
  54.         return new Configuration($this->getAlias());
  55.     }
  56.     private function registerService(string $name, array $configstring $classContainerBuilder $containerstring $method 'create'): string
  57.     {
  58.         $projectServiceId sprintf('%s.%s'$this->getAlias(), $name);
  59.         $isPublic $config['public'];
  60.         $factory $container->getDefinition(ProjectFactory::class);
  61.         if ($config['verifier_cache'] ?? null) {
  62.             $factory->addMethodCall('setVerifierCache', [new Reference($config['verifier_cache'])]);
  63.         }
  64.         $container->register($projectServiceId$class)
  65.             ->setFactory([$factory$method])
  66.             ->addArgument($config)
  67.             ->setPublic($isPublic);
  68.         if ($config['alias'] ?? null) {
  69.             $container->setAlias($config['alias'], $projectServiceId);
  70.             $container->getAlias($config['alias'])->setPublic($isPublic);
  71.         }
  72.         if ($config['default'] ?? false) {
  73.             $container->setAlias($class$projectServiceId);
  74.             $container->getAlias($class)->setPublic($isPublic);
  75.         }
  76.         return $projectServiceId;
  77.     }
  78.     private function assertThatOnlyOneDefaultProjectExists(array $projectConfigurations)
  79.     {
  80.         $count 0;
  81.         foreach ($projectConfigurations as $projectConfiguration) {
  82.             if ($projectConfiguration['default'] ?? false) {
  83.                 ++$count;
  84.             }
  85.             if ($count 1) {
  86.                 throw new InvalidConfigurationException('Only one project can be set as default.');
  87.             }
  88.         }
  89.     }
  90. }