src/Core/Content/Sitemap/ScheduledTask/SitemapGenerateTaskHandler.php line 78

  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\Content\Sitemap\ScheduledTask;
  3. use Shopware\Core\Content\Sitemap\Event\SitemapSalesChannelCriteriaEvent;
  4. use Shopware\Core\Content\Sitemap\Service\SitemapExporterInterface;
  5. use Shopware\Core\Defaults;
  6. use Shopware\Core\Framework\Context;
  7. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\NotFilter;
  11. use Shopware\Core\Framework\Log\Package;
  12. use Shopware\Core\Framework\MessageQueue\ScheduledTask\ScheduledTaskHandler;
  13. use Shopware\Core\System\SalesChannel\Aggregate\SalesChannelDomain\SalesChannelDomainEntity;
  14. use Shopware\Core\System\SalesChannel\SalesChannelEntity;
  15. use Shopware\Core\System\SystemConfig\SystemConfigService;
  16. use Symfony\Component\Messenger\Attribute\AsMessageHandler;
  17. use Symfony\Component\Messenger\MessageBusInterface;
  18. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  19. /**
  20.  * @internal
  21.  */
  22. #[AsMessageHandler(handlesSitemapGenerateTask::class)]
  23. #[Package('sales-channel')]
  24. final class SitemapGenerateTaskHandler extends ScheduledTaskHandler
  25. {
  26.     /**
  27.      * @internal
  28.      */
  29.     public function __construct(
  30.         EntityRepository $scheduledTaskRepository,
  31.         private readonly EntityRepository $salesChannelRepository,
  32.         private readonly SystemConfigService $systemConfigService,
  33.         private readonly MessageBusInterface $messageBus,
  34.         private readonly EventDispatcherInterface $eventDispatcher
  35.     ) {
  36.         parent::__construct($scheduledTaskRepository);
  37.     }
  38.     public function run(): void
  39.     {
  40.         $sitemapRefreshStrategy $this->systemConfigService->getInt('core.sitemap.sitemapRefreshStrategy');
  41.         if ($sitemapRefreshStrategy !== SitemapExporterInterface::STRATEGY_SCHEDULED_TASK) {
  42.             return;
  43.         }
  44.         $criteria = new Criteria();
  45.         $criteria->addAssociation('domains');
  46.         $criteria->addFilter(new NotFilter(
  47.             NotFilter::CONNECTION_AND,
  48.             [new EqualsFilter('domains.id'null)]
  49.         ));
  50.         $criteria->addAssociation('type');
  51.         $criteria->addFilter(new EqualsFilter('type.id'Defaults::SALES_CHANNEL_TYPE_STOREFRONT));
  52.         $context Context::createDefaultContext();
  53.         $this->eventDispatcher->dispatch(
  54.             new SitemapSalesChannelCriteriaEvent($criteria$context)
  55.         );
  56.         $salesChannels $this->salesChannelRepository->search($criteria$context)->getEntities();
  57.         /** @var SalesChannelEntity $salesChannel */
  58.         foreach ($salesChannels as $salesChannel) {
  59.             if ($salesChannel->getDomains() === null) {
  60.                 continue;
  61.             }
  62.             $languageIds $salesChannel->getDomains()->map(fn (SalesChannelDomainEntity $salesChannelDomain) => $salesChannelDomain->getLanguageId());
  63.             $languageIds array_unique($languageIds);
  64.             foreach ($languageIds as $languageId) {
  65.                 $this->messageBus->dispatch(new SitemapMessage($salesChannel->getId(), $languageIdnullnullfalse));
  66.             }
  67.         }
  68.     }
  69. }