vendor/willdurand/geocoder-bundle/src/ProviderFactory/AbstractFactory.php line 56

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4.  * This file is part of the BazingaGeocoderBundle package.
  5.  * For the full copyright and license information, please view the LICENSE
  6.  * file that was distributed with this source code.
  7.  *
  8.  * @license    MIT License
  9.  */
  10. namespace Bazinga\GeocoderBundle\ProviderFactory;
  11. use Geocoder\Provider\Provider;
  12. use Psr\Http\Client\ClientInterface;
  13. use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
  14. use Symfony\Component\OptionsResolver\OptionsResolver;
  15. /**
  16.  * An abstract factory that makes it easier to implement new factories. A class that extend the AbstractFactory
  17.  * should override AbstractFactory::$dependencies and AbstractFactory::configureOptionResolver().
  18.  *
  19.  * @author Tobias Nyholm <tobias.nyholm@gmail.com>
  20.  */
  21. abstract class AbstractFactory implements ProviderFactoryInterface
  22. {
  23.     /**
  24.      * @var list<array{requiredClass: class-string, packageName: string}>
  25.      */
  26.     protected static $dependencies = [];
  27.     protected ?ClientInterface $httpClient;
  28.     public function __construct(?ClientInterface $httpClient null)
  29.     {
  30.         $this->httpClient $httpClient;
  31.     }
  32.     /**
  33.      * @param array<mixed, mixed> $config
  34.      */
  35.     abstract protected function getProvider(array $config): Provider;
  36.     /**
  37.      * {@inheritdoc}
  38.      */
  39.     public function createProvider(array $options = []): Provider
  40.     {
  41.         $this->verifyDependencies();
  42.         $resolver = new OptionsResolver();
  43.         static::configureOptionResolver($resolver);
  44.         $config $resolver->resolve($options);
  45.         return $this->getProvider($config);
  46.     }
  47.     /**
  48.      * {@inheritdoc}
  49.      */
  50.     public static function validate(array $options$providerName)
  51.     {
  52.         static::verifyDependencies();
  53.         $resolver = new OptionsResolver();
  54.         static::configureOptionResolver($resolver);
  55.         try {
  56.             $resolver->resolve($options);
  57.         } catch (\Exception $e) {
  58.             $message sprintf(
  59.                 'Error while configure provider "%s". Verify your configuration at "bazinga_geocoder.providers.%s.options". %s',
  60.                 $providerName,
  61.                 $providerName,
  62.                 $e->getMessage()
  63.             );
  64.             throw new InvalidConfigurationException($message$e->getCode(), $e);
  65.         }
  66.     }
  67.     /**
  68.      * Make sure that we have the required class and throw and exception if we don't.
  69.      *
  70.      * @return void
  71.      *
  72.      * @throws \LogicException
  73.      */
  74.     protected static function verifyDependencies()
  75.     {
  76.         foreach (static::$dependencies as $dependency) {
  77.             if (!class_exists($dependency['requiredClass'])) {
  78.                 throw new \LogicException(sprintf('You must install the "%s" package to use the "%s" factory.'$dependency['packageName'], static::class));
  79.             }
  80.         }
  81.     }
  82.     /**
  83.      * By default, we do not have any options to configure. A factory should override this function and configure
  84.      * the options resolver.
  85.      *
  86.      * @return void
  87.      */
  88.     protected static function configureOptionResolver(OptionsResolver $resolver)
  89.     {
  90.     }
  91. }