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 $configs, ContainerBuilder $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 (1 === $projectConfigurationsCount) {
  25. $projectConfiguration['default'] = $projectConfiguration['default'] ?? true;
  26. }
  27. $this->processProjectConfiguration($projectName, $projectConfiguration, $container);
  28. }
  29. }
  30. private function processProjectConfiguration(string $name, array $config, ContainerBuilder $container): void
  31. {
  32. $this->registerService($name.'.database', $config, Firebase\Database::class, Firebase\Contract\Database::class, $container, 'createDatabase');
  33. $this->registerService($name.'.auth', $config, Firebase\Auth::class, Firebase\Contract\Auth::class, $container, 'createAuth');
  34. $this->registerService($name.'.storage', $config, Firebase\Storage::class, Firebase\Contract\Storage::class, $container, 'createStorage');
  35. $this->registerService($name.'.remote_config', $config, Firebase\RemoteConfig::class, Firebase\Contract\RemoteConfig::class, $container, 'createRemoteConfig');
  36. $this->registerService($name.'.messaging', $config, Firebase\Messaging::class, Firebase\Contract\Messaging::class, $container, 'createMessaging');
  37. $this->registerService($name.'.firestore', $config, Firebase\Firestore::class, Firebase\Contract\Firestore::class, $container, 'createFirestore');
  38. $this->registerService($name.'.dynamic_links', $config, Firebase\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 $config, ContainerBuilder $container): Configuration
  45. {
  46. return new Configuration($this->getAlias());
  47. }
  48. private function registerService(string $name, array $config, string $class, string $contract, ContainerBuilder $container, string $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. }