vendor/friendsofsymfony/elastica-bundle/src/Subscriber/PaginateElasticaQuerySubscriber.php line 39

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the FOSElasticaBundle package.
  4.  *
  5.  * (c) FriendsOfSymfony <http://friendsofsymfony.github.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 FOS\ElasticaBundle\Subscriber;
  11. use FOS\ElasticaBundle\Paginator\PaginatorAdapterInterface;
  12. use FOS\ElasticaBundle\Paginator\PartialResultsInterface;
  13. use Knp\Component\Pager\Event\ItemsEvent;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\RequestStack;
  17. class PaginateElasticaQuerySubscriber implements EventSubscriberInterface
  18. {
  19.     /**
  20.      * @var RequestStack
  21.      */
  22.     private $requestStack;
  23.     /**
  24.      * @param RequestStack $requestStack
  25.      */
  26.     public function __construct(RequestStack $requestStack)
  27.     {
  28.         $this->requestStack $requestStack;
  29.     }
  30.     /**
  31.      * @param ItemsEvent $event
  32.      */
  33.     public function items(ItemsEvent $event)
  34.     {
  35.         if ($event->target instanceof PaginatorAdapterInterface) {
  36.             // Add sort to query
  37.             $this->setSorting($event);
  38.             /** @var $results PartialResultsInterface */
  39.             $results $event->target->getResults($event->getOffset(), $event->getLimit());
  40.             $event->count $results->getTotalHits();
  41.             $event->items $results->toArray();
  42.             $aggregations $results->getAggregations();
  43.             if (null != $aggregations) {
  44.                 $event->setCustomPaginationParameter('aggregations'$aggregations);
  45.             }
  46.             $event->stopPropagation();
  47.         }
  48.     }
  49.     /**
  50.      * @return array
  51.      */
  52.     public static function getSubscribedEvents()
  53.     {
  54.         return [
  55.             'knp_pager.items' => ['items'1],
  56.         ];
  57.     }
  58.     /**
  59.      * Adds knp paging sort to query.
  60.      *
  61.      * @param ItemsEvent $event
  62.      */
  63.     protected function setSorting(ItemsEvent $event)
  64.     {
  65.         $options $event->options;
  66.         $sortField $this->getFromRequest($options['sortFieldParameterName'] ?? null);
  67.         if (!$sortField && isset($options['defaultSortFieldName'])) {
  68.             $sortField $options['defaultSortFieldName'];
  69.         }
  70.         if (!empty($sortField)) {
  71.             $event->target->getQuery()->setSort([
  72.                 $sortField => $this->getSort($sortField$options),
  73.             ]);
  74.         }
  75.     }
  76.     protected function getSort($sortField, array $options = [])
  77.     {
  78.         $sort = [
  79.             'order' => $this->getSortDirection($sortField$options),
  80.         ];
  81.         if (isset($options['sortNestedPath'])) {
  82.             $path is_callable($options['sortNestedPath']) ?
  83.                 $options['sortNestedPath']($sortField) : $options['sortNestedPath'];
  84.             if (!empty($path)) {
  85.                 $sort['nested_path'] = $path;
  86.             }
  87.         }
  88.         if (isset($options['sortNestedFilter'])) {
  89.             $filter is_callable($options['sortNestedFilter']) ?
  90.                 $options['sortNestedFilter']($sortField) : $options['sortNestedFilter'];
  91.             if (!empty($filter)) {
  92.                 $sort['nested_filter'] = $filter;
  93.             }
  94.         }
  95.         return $sort;
  96.     }
  97.     protected function getSortDirection($sortField, array $options = [])
  98.     {
  99.         $dir 'asc';
  100.         $sortDirection $this->getFromRequest($options['sortDirectionParameterName']);
  101.         if (empty($sortDirection) && isset($options['defaultSortDirection'])) {
  102.             $sortDirection $options['defaultSortDirection'];
  103.         }
  104.         if ('desc' === strtolower($sortDirection)) {
  105.             $dir 'desc';
  106.         }
  107.         // check if the requested sort field is in the sort whitelist
  108.         if (isset($options['sortFieldWhitelist']) && !in_array($sortField$options['sortFieldWhitelist'])) {
  109.             throw new \UnexpectedValueException(sprintf('Cannot sort by: [%s] this field is not in whitelist'$sortField));
  110.         }
  111.         return $dir;
  112.     }
  113.     /**
  114.      * @return Request|null
  115.      */
  116.     private function getRequest()
  117.     {
  118.         return $this->requestStack->getCurrentRequest();
  119.     }
  120.     /**
  121.      * @param string|null $key
  122.      * @return mixed|null
  123.      */
  124.     private function getFromRequest(?string $key)
  125.     {
  126.         if (null !== $key && null !== $request $this->getRequest()) {
  127.             return $request->get($key);
  128.         }
  129.         return null;
  130.     }
  131. }