vendor/symfony/doctrine-bridge/Form/Type/EntityType.php line 22

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <[email protected]>
  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\Bridge\Doctrine\Form\Type;
  11. use Doctrine\Common\Persistence\ObjectManager;
  12. use Doctrine\ORM\Query\Parameter;
  13. use Doctrine\ORM\QueryBuilder;
  14. use Symfony\Bridge\Doctrine\Form\ChoiceList\ORMQueryBuilderLoader;
  15. use Symfony\Component\Form\Exception\UnexpectedTypeException;
  16. use Symfony\Component\OptionsResolver\Options;
  17. use Symfony\Component\OptionsResolver\OptionsResolver;
  18. class EntityType extends DoctrineType
  19. {
  20.     public function configureOptions(OptionsResolver $resolver)
  21.     {
  22.         parent::configureOptions($resolver);
  23.         // Invoke the query builder closure so that we can cache choice lists
  24.         // for equal query builders
  25.         $queryBuilderNormalizer = function (Options $options$queryBuilder) {
  26.             if (\is_callable($queryBuilder)) {
  27.                 $queryBuilder $queryBuilder($options['em']->getRepository($options['class']));
  28.                 if (null !== $queryBuilder && !$queryBuilder instanceof QueryBuilder) {
  29.                     throw new UnexpectedTypeException($queryBuilder'Doctrine\ORM\QueryBuilder');
  30.                 }
  31.             }
  32.             return $queryBuilder;
  33.         };
  34.         $resolver->setNormalizer('query_builder'$queryBuilderNormalizer);
  35.         $resolver->setAllowedTypes('query_builder', ['null''callable''Doctrine\ORM\QueryBuilder']);
  36.     }
  37.     /**
  38.      * Return the default loader object.
  39.      *
  40.      * @param QueryBuilder $queryBuilder
  41.      * @param string       $class
  42.      *
  43.      * @return ORMQueryBuilderLoader
  44.      */
  45.     public function getLoader(ObjectManager $manager$queryBuilder$class)
  46.     {
  47.         if (!$queryBuilder instanceof QueryBuilder) {
  48.             throw new \TypeError(sprintf('Expected an instance of %s, but got %s.'QueryBuilder::class, \is_object($queryBuilder) ? \get_class($queryBuilder) : \gettype($queryBuilder)));
  49.         }
  50.         return new ORMQueryBuilderLoader($queryBuilder);
  51.     }
  52.     /**
  53.      * {@inheritdoc}
  54.      */
  55.     public function getBlockPrefix()
  56.     {
  57.         return 'entity';
  58.     }
  59.     /**
  60.      * We consider two query builders with an equal SQL string and
  61.      * equal parameters to be equal.
  62.      *
  63.      * @param QueryBuilder $queryBuilder
  64.      *
  65.      * @internal This method is public to be usable as callback. It should not
  66.      *           be used in user code.
  67.      */
  68.     public function getQueryBuilderPartsForCachingHash($queryBuilder): ?array
  69.     {
  70.         if (!$queryBuilder instanceof QueryBuilder) {
  71.             throw new \TypeError(sprintf('Expected an instance of %s, but got %s.'QueryBuilder::class, \is_object($queryBuilder) ? \get_class($queryBuilder) : \gettype($queryBuilder)));
  72.         }
  73.         return [
  74.             $queryBuilder->getQuery()->getSQL(),
  75.             array_map([$this'parameterToArray'], $queryBuilder->getParameters()->toArray()),
  76.         ];
  77.     }
  78.     /**
  79.      * Converts a query parameter to an array.
  80.      */
  81.     private function parameterToArray(Parameter $parameter): array
  82.     {
  83.         return [$parameter->getName(), $parameter->getType(), $parameter->getValue()];
  84.     }
  85. }