<?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 CitiesProfilesSitemapSubscriber implements EventSubscriberInterface
{
private BrcClient $brcClient;
private int $companiesLimit;
public function __construct(BrcClient $brcClient, int $companiesLimit)
{
$this->brcClient = $brcClient;
$this->companiesLimit = $companiesLimit;
}
/**
* @inheritDoc
*/
public static function getSubscribedEvents(): array
{
return [
SitemapPopulateEvent::class => 'populate',
];
}
public function populate(SitemapPopulateEvent $event): void
{
$urls = $event->getUrlContainer();
$router = $event->getUrlGenerator();
foreach ($this->brcClient->getCitiesProfilesSitemap() as $city) {
$totalPages = (int)ceil($city->getTotalProfiles() / $this->companiesLimit);
for ($page = 1; $page <= $totalPages; $page++) {
$urls->addUrl(
new UrlConcrete(
$router->generate(
'city_companies_list',
$this->generateRouteParameters($city->getId(), $city->getSlug(), $page),
UrlGeneratorInterface::ABSOLUTE_URL
)
),
'city_companies_list'
);
}
}
}
/**
*
* @param int|null $page
* @return array
*/
private function generateRouteParameters(int $cityId, string $citySlug, ?int $page): array
{
if ($page && $page > 1) {
return ['id' => $cityId, 'slug' => $citySlug, 'page' => $page];
}
return ['id' => $cityId, 'slug' => $citySlug];
}
}