vendor/symfony/form/Extension/DependencyInjection/DependencyInjectionExtension.php line 45

  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Component\Form\Extension\DependencyInjection;
  11. use Psr\Container\ContainerInterface;
  12. use Symfony\Component\Form\Exception\InvalidArgumentException;
  13. use Symfony\Component\Form\FormExtensionInterface;
  14. use Symfony\Component\Form\FormTypeGuesserChain;
  15. use Symfony\Component\Form\FormTypeGuesserInterface;
  16. use Symfony\Component\Form\FormTypeInterface;
  17. class DependencyInjectionExtension implements FormExtensionInterface
  18. {
  19.     private ?FormTypeGuesserChain $guesser null;
  20.     private bool $guesserLoaded false;
  21.     private ContainerInterface $typeContainer;
  22.     private array $typeExtensionServices;
  23.     private iterable $guesserServices;
  24.     /**
  25.      * @param iterable[] $typeExtensionServices
  26.      */
  27.     public function __construct(ContainerInterface $typeContainer, array $typeExtensionServicesiterable $guesserServices)
  28.     {
  29.         $this->typeContainer $typeContainer;
  30.         $this->typeExtensionServices $typeExtensionServices;
  31.         $this->guesserServices $guesserServices;
  32.     }
  33.     public function getType(string $name): FormTypeInterface
  34.     {
  35.         if (!$this->typeContainer->has($name)) {
  36.             throw new InvalidArgumentException(sprintf('The field type "%s" is not registered in the service container.'$name));
  37.         }
  38.         return $this->typeContainer->get($name);
  39.     }
  40.     public function hasType(string $name): bool
  41.     {
  42.         return $this->typeContainer->has($name);
  43.     }
  44.     public function getTypeExtensions(string $name): array
  45.     {
  46.         $extensions = [];
  47.         if (isset($this->typeExtensionServices[$name])) {
  48.             foreach ($this->typeExtensionServices[$name] as $extension) {
  49.                 $extensions[] = $extension;
  50.                 $extendedTypes = [];
  51.                 foreach ($extension::getExtendedTypes() as $extendedType) {
  52.                     $extendedTypes[] = $extendedType;
  53.                 }
  54.                 // validate the result of getExtendedTypes() to ensure it is consistent with the service definition
  55.                 if (!\in_array($name$extendedTypestrue)) {
  56.                     throw new InvalidArgumentException(sprintf('The extended type "%s" specified for the type extension class "%s" does not match any of the actual extended types (["%s"]).'$name$extension::class, implode('", "'$extendedTypes)));
  57.                 }
  58.             }
  59.         }
  60.         return $extensions;
  61.     }
  62.     public function hasTypeExtensions(string $name): bool
  63.     {
  64.         return isset($this->typeExtensionServices[$name]);
  65.     }
  66.     public function getTypeGuesser(): ?FormTypeGuesserInterface
  67.     {
  68.         if (!$this->guesserLoaded) {
  69.             $this->guesserLoaded true;
  70.             $guessers = [];
  71.             foreach ($this->guesserServices as $serviceId => $service) {
  72.                 $guessers[] = $service;
  73.             }
  74.             if ($guessers) {
  75.                 $this->guesser = new FormTypeGuesserChain($guessers);
  76.             }
  77.         }
  78.         return $this->guesser;
  79.     }
  80. }