vendor/symfony/ux-autocomplete/src/Form/WrappedEntityTypeAutocompleter.php line 118

Open in your IDE?
  1. <?php
  2. namespace Symfony\UX\Autocomplete\Form;
  3. use Doctrine\ORM\EntityRepository;
  4. use Doctrine\ORM\QueryBuilder;
  5. use Symfony\Component\Form\FormFactoryInterface;
  6. use Symfony\Component\Form\FormInterface;
  7. use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
  8. use Symfony\Component\PropertyAccess\PropertyPathInterface;
  9. use Symfony\Component\Security\Core\Security;
  10. use Symfony\UX\Autocomplete\Doctrine\EntityMetadata;
  11. use Symfony\UX\Autocomplete\Doctrine\EntityMetadataFactory;
  12. use Symfony\UX\Autocomplete\Doctrine\EntitySearchUtil;
  13. use Symfony\UX\Autocomplete\EntityAutocompleterInterface;
  14. /**
  15.  * An entity auto-completer that wraps a form type to get its information.
  16.  *
  17.  * @internal
  18.  */
  19. final class WrappedEntityTypeAutocompleter implements EntityAutocompleterInterface
  20. {
  21.     private ?FormInterface $form null;
  22.     private ?EntityMetadata $entityMetadata null;
  23.     public function __construct(
  24.         private string $formType,
  25.         private FormFactoryInterface $formFactory,
  26.         private EntityMetadataFactory $metadataFactory,
  27.         private PropertyAccessorInterface $propertyAccessor,
  28.         private EntitySearchUtil $entitySearchUtil
  29.     ) {
  30.     }
  31.     public function getEntityClass(): string
  32.     {
  33.         return $this->getFormOption('class');
  34.     }
  35.     public function createFilteredQueryBuilder(EntityRepository $repositorystring $query): QueryBuilder
  36.     {
  37.         $queryBuilder $this->getFormOption('query_builder');
  38.         $queryBuilder $queryBuilder ?: $repository->createQueryBuilder('entity');
  39.         if ($filterQuery $this->getFilterQuery()) {
  40.             $filterQuery($queryBuilder$query$repository);
  41.             return $queryBuilder;
  42.         }
  43.         // avoid filtering if there is no query
  44.         if (!$query) {
  45.             return $queryBuilder;
  46.         }
  47.         $this->entitySearchUtil->addSearchClause(
  48.             $queryBuilder,
  49.             $query,
  50.             $this->getEntityClass(),
  51.             $this->getSearchableFields()
  52.         );
  53.         return $queryBuilder;
  54.     }
  55.     public function getLabel(object $entity): string
  56.     {
  57.         $choiceLabel $this->getFormOption('choice_label');
  58.         if (null === $choiceLabel) {
  59.             return (string) $entity;
  60.         }
  61.         if (\is_string($choiceLabel) || $choiceLabel instanceof PropertyPathInterface) {
  62.             return $this->propertyAccessor->getValue($entity$choiceLabel);
  63.         }
  64.         // 0 hardcoded as the "index", should not be relevant
  65.         return $choiceLabel($entity0$this->getValue($entity));
  66.     }
  67.     public function getValue(object $entity): string
  68.     {
  69.         return $this->getEntityMetadata()->getIdValue($entity);
  70.     }
  71.     public function isGranted(Security $security): bool
  72.     {
  73.         $securityOption $this->getForm()->getConfig()->getOption('security');
  74.         if (false === $securityOption) {
  75.             return true;
  76.         }
  77.         if (\is_string($securityOption)) {
  78.             return $security->isGranted($securityOption$this);
  79.         }
  80.         if (\is_callable($securityOption)) {
  81.             return $securityOption($security);
  82.         }
  83.         throw new \InvalidArgumentException('Invalid passed to the "security" option: it must be the boolean true, a string role or a callable.');
  84.     }
  85.     private function getFormOption(string $name): mixed
  86.     {
  87.         $form $this->getForm();
  88.         $formOptions $form['autocomplete']->getConfig()->getOptions();
  89.         return $formOptions[$name] ?? null;
  90.     }
  91.     private function getForm(): FormInterface
  92.     {
  93.         if (null === $this->form) {
  94.             $this->form $this->formFactory->create($this->formType);
  95.         }
  96.         return $this->form;
  97.     }
  98.     private function getSearchableFields(): ?array
  99.     {
  100.         return $this->getForm()->getConfig()->getOption('searchable_fields');
  101.     }
  102.     private function getFilterQuery(): ?callable
  103.     {
  104.         return $this->getForm()->getConfig()->getOption('filter_query');
  105.     }
  106.     private function getEntityMetadata(): EntityMetadata
  107.     {
  108.         if (null === $this->entityMetadata) {
  109.             $this->entityMetadata $this->metadataFactory->create($this->getEntityClass());
  110.         }
  111.         return $this->entityMetadata;
  112.     }
  113. }