vendor/ibexa/taxonomy/src/lib/Search/ElasticSearch/IndexCreateSubscriber.php line 42

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\Taxonomy\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\Taxonomy\Search\SearchIndexDataProvider;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. final class IndexCreateSubscriber implements EventSubscriberInterface
  16. {
  17. private SearchIndexDataProvider $searchIndexDataProvider;
  18. private ContentHandler $contentHandler;
  19. public function __construct(SearchIndexDataProvider $searchIndexDataProvider, ContentHandler $contentHandler)
  20. {
  21. $this->searchIndexDataProvider = $searchIndexDataProvider;
  22. $this->contentHandler = $contentHandler;
  23. }
  24. /**
  25. * @return array<string,string>
  26. */
  27. public static function getSubscribedEvents(): array
  28. {
  29. return [
  30. ContentIndexCreateEvent::class => 'onContentIndexCreate',
  31. LocationIndexCreateEvent::class => 'onLocationIndexCreate',
  32. ];
  33. }
  34. public function onContentIndexCreate(ContentIndexCreateEvent $event): void
  35. {
  36. $this->appendSearchData($event->getDocument(), $event->getContent());
  37. }
  38. public function onLocationIndexCreate(LocationIndexCreateEvent $event): void
  39. {
  40. $content = $this->contentHandler->load(
  41. $event->getLocation()->contentId
  42. );
  43. $this->appendSearchData($event->getDocument(), $content);
  44. }
  45. private function appendSearchData(Document $document, SPIContent $content): void
  46. {
  47. $fields = $this->searchIndexDataProvider->getSearchData($content);
  48. foreach ($fields as $field) {
  49. $document->fields[] = $field;
  50. }
  51. }
  52. }