vendor/ibexa/taxonomy/src/lib/Event/Subscriber/SynchronizeEntryWithContentSubscriber.php line 70

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\Event\Subscriber;
  8. use Ibexa\Contracts\Core\Repository\Events\Content\DeleteTranslationEvent;
  9. use Ibexa\Contracts\Core\Repository\Events\Content\PublishVersionEvent;
  10. use Ibexa\Contracts\Core\Repository\Events\Content\UpdateContentMetadataEvent;
  11. use Ibexa\Contracts\Core\Repository\Values\ContentType\ContentType;
  12. use Ibexa\Contracts\Taxonomy\Event\MoveTaxonomyEntryEvent;
  13. use Ibexa\Contracts\Taxonomy\Event\MoveTaxonomyEntryRelativeToSiblingEvent;
  14. use Ibexa\Contracts\Taxonomy\Service\TaxonomyServiceInterface;
  15. use Ibexa\Taxonomy\Exception\TaxonomyEntryNotFoundException;
  16. use Ibexa\Taxonomy\Repository\Content\ContentSynchronizerInterface;
  17. use Ibexa\Taxonomy\Service\TaxonomyConfiguration;
  18. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  19. /**
  20.  * @internal
  21.  */
  22. final class SynchronizeEntryWithContentSubscriber implements EventSubscriberInterface
  23. {
  24.     private TaxonomyServiceInterface $taxonomyService;
  25.     private TaxonomyConfiguration $taxonomyConfiguration;
  26.     private ContentSynchronizerInterface $contentSynchronizer;
  27.     public function __construct(
  28.         TaxonomyServiceInterface $taxonomyService,
  29.         TaxonomyConfiguration $taxonomyConfiguration,
  30.         ContentSynchronizerInterface $contentSynchronizer
  31.     ) {
  32.         $this->taxonomyService $taxonomyService;
  33.         $this->taxonomyConfiguration $taxonomyConfiguration;
  34.         $this->contentSynchronizer $contentSynchronizer;
  35.     }
  36.     public static function getSubscribedEvents(): array
  37.     {
  38.         return [
  39.             PublishVersionEvent::class => 'onVersionPublish',
  40.             DeleteTranslationEvent::class => 'onTranslationDelete',
  41.             UpdateContentMetadataEvent::class => 'onContentMetadataUpdate',
  42.             MoveTaxonomyEntryEvent::class => 'onTaxonomyEntryMove',
  43.             MoveTaxonomyEntryRelativeToSiblingEvent::class => 'onMoveTaxonomyEntryRelativeToSibling',
  44.         ];
  45.     }
  46.     /**
  47.      * @throws \Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException
  48.      * @throws \Ibexa\Contracts\Core\Repository\Exceptions\UnauthorizedException
  49.      */
  50.     public function onVersionPublish(PublishVersionEvent $event): void
  51.     {
  52.         $content $event->getContent();
  53.         $this->doSynchronizeContent($content->getContentType(), $content->id);
  54.     }
  55.     /**
  56.      * @throws \Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException
  57.      * @throws \Ibexa\Contracts\Core\Repository\Exceptions\UnauthorizedException
  58.      */
  59.     public function onTranslationDelete(DeleteTranslationEvent $event): void
  60.     {
  61.         $contentInfo $event->getContentInfo();
  62.         $this->doSynchronizeContent($contentInfo->getContentType(), $contentInfo->id);
  63.     }
  64.     /**
  65.      * @throws \Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException
  66.      * @throws \Ibexa\Contracts\Core\Repository\Exceptions\UnauthorizedException
  67.      */
  68.     public function onContentMetadataUpdate(UpdateContentMetadataEvent $event): void
  69.     {
  70.         $content $event->getContent();
  71.         $this->doSynchronizeContent($content->getContentType(), $content->id);
  72.     }
  73.     public function onTaxonomyEntryMove(MoveTaxonomyEntryEvent $event): void
  74.     {
  75.         $content $event->getTaxonomyEntry()->getContent();
  76.         $this->doReverseSynchronizeContent($content->getContentType(), $content->id);
  77.     }
  78.     public function onMoveTaxonomyEntryRelativeToSibling(MoveTaxonomyEntryRelativeToSiblingEvent $event): void
  79.     {
  80.         $content $event->getTaxonomyEntry()->getContent();
  81.         $this->doReverseSynchronizeContent($content->getContentType(), $content->id);
  82.     }
  83.     /**
  84.      * @throws \Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException
  85.      * @throws \Ibexa\Contracts\Core\Repository\Exceptions\UnauthorizedException
  86.      */
  87.     private function doSynchronizeContent(ContentType $contentTypeint $contentId): void
  88.     {
  89.         if (!$this->taxonomyConfiguration->isContentTypeAssociatedWithTaxonomy($contentType)) {
  90.             return;
  91.         }
  92.         try {
  93.             $taxonomyEntry $this->taxonomyService->loadEntryByContentId($contentId);
  94.         } catch (TaxonomyEntryNotFoundException $e) {
  95.             return;
  96.         }
  97.         $this->contentSynchronizer->synchronize($taxonomyEntry);
  98.     }
  99.     private function doReverseSynchronizeContent(ContentType $contentTypeint $contentId): void
  100.     {
  101.         if (!$this->taxonomyConfiguration->isContentTypeAssociatedWithTaxonomy($contentType)) {
  102.             return;
  103.         }
  104.         try {
  105.             $taxonomyEntry $this->taxonomyService->loadEntryByContentId($contentId);
  106.         } catch (TaxonomyEntryNotFoundException $e) {
  107.             return;
  108.         }
  109.         $this->contentSynchronizer->reverseSynchronize($taxonomyEntry);
  110.     }
  111. }