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 <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\Bridge\Doctrine\Form\Type;
  11. use Doctrine\ORM\Query\Parameter;
  12. use Doctrine\ORM\QueryBuilder;
  13. use Doctrine\Persistence\ObjectManager;
  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, QueryBuilder::class);
  30. }
  31. }
  32. return $queryBuilder;
  33. };
  34. $resolver->setNormalizer('query_builder', $queryBuilderNormalizer);
  35. $resolver->setAllowedTypes('query_builder', ['null', 'callable', QueryBuilder::class]);
  36. }
  37. /**
  38. * Return the default loader object.
  39. *
  40. * @param QueryBuilder $queryBuilder
  41. *
  42. * @return ORMQueryBuilderLoader
  43. */
  44. public function getLoader(ObjectManager $manager, object $queryBuilder, string $class)
  45. {
  46. if (!$queryBuilder instanceof QueryBuilder) {
  47. throw new \TypeError(sprintf('Expected an instance of "%s", but got "%s".', QueryBuilder::class, get_debug_type($queryBuilder)));
  48. }
  49. return new ORMQueryBuilderLoader($queryBuilder);
  50. }
  51. /**
  52. * {@inheritdoc}
  53. */
  54. public function getBlockPrefix()
  55. {
  56. return 'entity';
  57. }
  58. /**
  59. * We consider two query builders with an equal SQL string and
  60. * equal parameters to be equal.
  61. *
  62. * @param QueryBuilder $queryBuilder
  63. *
  64. * @internal This method is public to be usable as callback. It should not
  65. * be used in user code.
  66. */
  67. public function getQueryBuilderPartsForCachingHash(object $queryBuilder): ?array
  68. {
  69. if (!$queryBuilder instanceof QueryBuilder) {
  70. throw new \TypeError(sprintf('Expected an instance of "%s", but got "%s".', QueryBuilder::class, get_debug_type($queryBuilder)));
  71. }
  72. return [
  73. $queryBuilder->getQuery()->getSQL(),
  74. array_map([$this, 'parameterToArray'], $queryBuilder->getParameters()->toArray()),
  75. ];
  76. }
  77. /**
  78. * Converts a query parameter to an array.
  79. */
  80. private function parameterToArray(Parameter $parameter): array
  81. {
  82. return [$parameter->getName(), $parameter->getType(), $parameter->getValue()];
  83. }
  84. }