src/EventSubscriber/Management/SearchSubscriber.php line 27

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\Management;
  3. use EasyCorp\Bundle\EasyAdminBundle\Event\EasyAdminEvents;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\EventDispatcher\GenericEvent;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\RequestStack;
  8. class SearchSubscriber implements EventSubscriberInterface
  9. {
  10.     public function __construct(
  11.         private RequestStack $requestStack,
  12.     ) {}
  13.     public static function getSubscribedEvents(): array
  14.     {
  15.         return [
  16.             EasyAdminEvents::PRE_SEARCH => 'lowercaseSearchRequest',
  17.             EasyAdminEvents::POST_SEARCH_QUERY_BUILDER => [
  18.                 ['addRegexPhoneSearch'0]
  19.             ],
  20.         ];
  21.     }
  22.     public function addRegexPhoneSearch(GenericEvent $event): void
  23.     {
  24.         // if($event->getArgument('entity')['name'] != 'Profile')
  25.         //     return;
  26.         $searchableFields array_keys($event->getArgument('searchable_fields'));
  27.         $queryBuilder $event->getArgument('query_builder');
  28.         $entitiesAlreadyJoined $queryBuilder->getAllAliases();
  29.         foreach ($searchableFields as $fieldName) {
  30.             if(false === $this->endsWith($fieldName'phoneNumber'))
  31.                 continue;
  32.             $entityName 'entity';
  33.             if (false !== strpos($fieldName'.')) {
  34.                 // support arbitrarily nested associations (e.g. foo.bar.baz.qux)
  35.                 $associationComponents \explode('.'$fieldName);
  36.                 for ($i 0$i \count($associationComponents) - 1; ++$i) {
  37.                     $associatedEntityName $associationComponents[$i];
  38.                     $associatedFieldName $associationComponents[$i 1];
  39.                     if (!\in_array($associatedEntityName$entitiesAlreadyJoined)) {
  40.                         $parentEntityName === $i 'entity' $associationComponents[$i 1];
  41.                         $queryBuilder->leftJoin($parentEntityName '.' $associatedEntityName$associatedEntityName);
  42.                         $entitiesAlreadyJoined[] = $associatedEntityName;
  43.                     }
  44.                     $entityName $associatedEntityName;
  45.                     $fieldName $associatedFieldName;
  46.                 }
  47.             }
  48.             $queryBuilder->orWhere(\sprintf("REGEXP_REPLACE(%s.%s, '-| ', '') LIKE :fuzzy_query"$entityName$fieldName));
  49.             $queryBuilder->setParameter('fuzzy_query''%'.$event->getArgument('search_query').'%');
  50.         }
  51.     }
  52.     public function lowercaseSearchRequest(GenericEvent $event): void
  53.     {
  54.         $this->requestStack->getCurrentRequest()->query->set(
  55.             'query',
  56.             mb_strtolower($this->requestStack->getCurrentRequest()->query->get('query'))
  57.         );
  58.     }
  59.     protected function endsWith$haystack$needle )
  60.     {
  61.         $length strlen$needle );
  62.         if( !$length ) {
  63.             return true;
  64.         }
  65.         return substr$haystack, -$length ) === $needle;
  66.     }
  67. }