vendor/ibexa/product-catalog/src/lib/Local/Repository/Search/ElasticSearch/IndexCreateSubscriber.php line 58

Open in your IDE?
  1. <?php
  2. /**
  3.  * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4.  * @license For full copyright and license information view LICENSE file distributed with this source code.
  5.  */
  6. declare(strict_types=1);
  7. namespace Ibexa\ProductCatalog\Local\Repository\Search\ElasticSearch;
  8. use Ibexa\Contracts\Core\Persistence\Content as SPIContent;
  9. use Ibexa\Contracts\Core\Persistence\Content\Handler as ContentHandler;
  10. use Ibexa\Contracts\Core\Search\Document;
  11. use Ibexa\Contracts\Elasticsearch\Mapping\Event\ContentIndexCreateEvent;
  12. use Ibexa\Contracts\Elasticsearch\Mapping\Event\LocationIndexCreateEvent;
  13. use Ibexa\ProductCatalog\Local\Repository\Search\Common\IndexDataProvider\IndexDataProviderInterface;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. final class IndexCreateSubscriber implements EventSubscriberInterface
  16. {
  17.     private ContentHandler $contentHandler;
  18.     /** @var \Ibexa\ProductCatalog\Local\Repository\Search\Common\IndexDataProvider\IndexDataProviderInterface[] */
  19.     private iterable $indexDataProviders;
  20.     /**
  21.      * @param \Ibexa\ProductCatalog\Local\Repository\Search\Common\IndexDataProvider\IndexDataProviderInterface[] $indexDataProviders
  22.      */
  23.     public function __construct(ContentHandler $contentHandleriterable $indexDataProviders)
  24.     {
  25.         $this->contentHandler $contentHandler;
  26.         $this->indexDataProviders $indexDataProviders;
  27.     }
  28.     public static function getSubscribedEvents(): array
  29.     {
  30.         return [
  31.             ContentIndexCreateEvent::class => 'onContentIndexCreate',
  32.             LocationIndexCreateEvent::class => 'onLocationIndexCreate',
  33.         ];
  34.     }
  35.     public function onContentIndexCreate(ContentIndexCreateEvent $event): void
  36.     {
  37.         foreach ($this->indexDataProviders as $indexDataProvider) {
  38.             if (!$indexDataProvider->isSupported($event->getContent())) {
  39.                 continue;
  40.             }
  41.             $this->appendSearchData(
  42.                 $indexDataProvider,
  43.                 $event->getDocument(),
  44.                 $event->getContent()
  45.             );
  46.         }
  47.     }
  48.     public function onLocationIndexCreate(LocationIndexCreateEvent $event): void
  49.     {
  50.         $content $this->contentHandler->load(
  51.             $event->getLocation()->contentId
  52.         );
  53.         foreach ($this->indexDataProviders as $indexDataProvider) {
  54.             if (!$indexDataProvider->isSupported($content)) {
  55.                 continue;
  56.             }
  57.             $this->appendSearchData(
  58.                 $indexDataProvider,
  59.                 $event->getDocument(),
  60.                 $content
  61.             );
  62.         }
  63.     }
  64.     private function appendSearchData(
  65.         IndexDataProviderInterface $indexDataProvider,
  66.         Document $document,
  67.         SPIContent $content
  68.     ): void {
  69.         foreach ($indexDataProvider->getSearchData($content) as $field) {
  70.             $document->fields[] = $field;
  71.         }
  72.     }
  73. }