vendor/symfony/form/FormTypeGuesserChain.php line 50

  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;
  11. use Symfony\Component\Form\Exception\UnexpectedTypeException;
  12. use Symfony\Component\Form\Guess\Guess;
  13. use Symfony\Component\Form\Guess\TypeGuess;
  14. use Symfony\Component\Form\Guess\ValueGuess;
  15. class FormTypeGuesserChain implements FormTypeGuesserInterface
  16. {
  17.     private array $guessers = [];
  18.     /**
  19.      * @param FormTypeGuesserInterface[] $guessers
  20.      *
  21.      * @throws UnexpectedTypeException if any guesser does not implement FormTypeGuesserInterface
  22.      */
  23.     public function __construct(iterable $guessers)
  24.     {
  25.         $tmpGuessers = [];
  26.         foreach ($guessers as $guesser) {
  27.             if (!$guesser instanceof FormTypeGuesserInterface) {
  28.                 throw new UnexpectedTypeException($guesserFormTypeGuesserInterface::class);
  29.             }
  30.             if ($guesser instanceof self) {
  31.                 $tmpGuessers[] = $guesser->guessers;
  32.             } else {
  33.                 $tmpGuessers[] = [$guesser];
  34.             }
  35.         }
  36.         $this->guessers array_merge([], ...$tmpGuessers);
  37.     }
  38.     public function guessType(string $classstring $property): ?TypeGuess
  39.     {
  40.         return $this->guess(function ($guesser) use ($class$property) {
  41.             return $guesser->guessType($class$property);
  42.         });
  43.     }
  44.     public function guessRequired(string $classstring $property): ?ValueGuess
  45.     {
  46.         return $this->guess(function ($guesser) use ($class$property) {
  47.             return $guesser->guessRequired($class$property);
  48.         });
  49.     }
  50.     public function guessMaxLength(string $classstring $property): ?ValueGuess
  51.     {
  52.         return $this->guess(function ($guesser) use ($class$property) {
  53.             return $guesser->guessMaxLength($class$property);
  54.         });
  55.     }
  56.     public function guessPattern(string $classstring $property): ?ValueGuess
  57.     {
  58.         return $this->guess(function ($guesser) use ($class$property) {
  59.             return $guesser->guessPattern($class$property);
  60.         });
  61.     }
  62.     /**
  63.      * Executes a closure for each guesser and returns the best guess from the
  64.      * return values.
  65.      *
  66.      * @param \Closure $closure The closure to execute. Accepts a guesser
  67.      *                          as argument and should return a Guess instance
  68.      */
  69.     private function guess(\Closure $closure): ?Guess
  70.     {
  71.         $guesses = [];
  72.         foreach ($this->guessers as $guesser) {
  73.             if ($guess $closure($guesser)) {
  74.                 $guesses[] = $guess;
  75.             }
  76.         }
  77.         return Guess::getBestGuess($guesses);
  78.     }
  79. }