src/Service/EntitySortService.php line 33

Open in your IDE?
  1. <?php
  2. namespace App\Service;
  3. use Doctrine\ORM\QueryBuilder;
  4. use Symfony\Component\HttpFoundation\RequestStack;
  5. use Symfony\Contracts\Translation\TranslatorInterface;
  6. class EntitySortService
  7. {
  8.     public function getCurrentLocale():string
  9.     {
  10.         return $this->requestStack->getCurrentRequest()->getLocale();
  11.     }
  12.     public function __construct(
  13.         private RequestStack $requestStack,
  14.         private TranslatorInterface $translator
  15.     ) {}
  16.     public function sortEntityArrayUsingStringCompareByFieldName(array $arraystring $field): array
  17.     {
  18.         $field 'get' ucfirst($field);
  19.         uasort($array, function($a$b) use ($field): int {
  20.             return strcmp($a->{$field}(), $b->{$field}());
  21.         });
  22.         return $array;
  23.     }
  24.     public function sortEntityArrayByTranslatableFieldName(array $arraystring $translatableFieldName, ?callable $firstLevelSortFunction null): array
  25.     {
  26.         $translatableFieldName 'get' ucfirst($translatableFieldName);
  27.         uasort($array, function($a$b) use ($translatableFieldName$firstLevelSortFunction) {
  28.             $nameCompareResult strcmp(
  29.                 $this->translator->trans($a->{$translatableFieldName}()),
  30.                 $this->translator->trans($b->{$translatableFieldName}())
  31.             );
  32.             if(null !== $firstLevelSortFunction) {
  33.                 $firstLevelFunctionCompareResult $firstLevelSortFunction($a$b);
  34.                 return === $firstLevelFunctionCompareResult $nameCompareResult $firstLevelFunctionCompareResult;
  35.             } else {
  36.                 return $nameCompareResult;
  37.             }
  38. //            return strcmp(
  39. //                $this->translator->trans($a->{$translatableFieldName}()),
  40. //                $this->translator->trans($b->{$translatableFieldName}())
  41. //            );
  42.         });
  43.         return $array;
  44.     }
  45.     public function modifyQueryBuilderToSortByCurrentTranslation(QueryBuilder &$qbstring $dqlAliasstring $fieldName): void
  46.     {
  47.         $qb->orderBy(sprintf('json_unquote(json_extract(%s.%s, :json_path))'$dqlAlias$fieldName))
  48.             ->setParameter('json_path'sprintf('$.%s'$this->getCurrentLocale()));
  49.     }
  50. }