<?php
namespace App\Event\EventSubscriber\Sitemap;
use App\Api\BrcBackend\BrcClient;
use Presta\SitemapBundle\Event\SitemapPopulateEvent;
use Presta\SitemapBundle\Sitemap\Url\UrlConcrete;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
final class CitiesListSitemapSubscriber implements EventSubscriberInterface
{
private BrcClient $brcClient;
private int $citiesLimit;
public function __construct(BrcClient $brcClient, int $citiesLimit)
{
$this->brcClient = $brcClient;
$this->citiesLimit = $citiesLimit;
}
/**
* @inheritDoc
*/
public static function getSubscribedEvents(): array
{
return [
SitemapPopulateEvent::class => 'populate',
];
}
public function populate(SitemapPopulateEvent $event): void
{
$total = $this->brcClient->getTotalCitiesWithVisibleProfiles();
$totalPages = (int)ceil($total / $this->citiesLimit);
$urls = $event->getUrlContainer();
$router = $event->getUrlGenerator();
for ($page = 1; $page <= $totalPages; $page++) {
$urls->addUrl(
new UrlConcrete(
$router->generate(
'city_list',
$this->generateRouteParameters($page),
UrlGeneratorInterface::ABSOLUTE_URL
)
),
'cities_list'
);
}
}
/**
*
* @param int|null $page
* @return array
*/
private function generateRouteParameters(?int $page): array
{
if ($page && $page > 1) {
return ['page' => $page];
}
return [];
}
}