<?php
namespace App\EventListener;
use App\Entity\Route;
use Doctrine\Persistence\ManagerRegistry;
use Flagception\Manager\FeatureManagerInterface;
use Presta\SitemapBundle\Service\UrlContainerInterface;
use Presta\SitemapBundle\Sitemap\Url\UrlConcrete;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class SitemapPageSubscriber extends AbstractSitemapSubscriber
{
private FeatureManagerInterface $featureManager;
public function __construct(
UrlGeneratorInterface $urlGenerator,
ManagerRegistry $doctrine,
FeatureManagerInterface $featureManager
) {
parent::__construct($urlGenerator, $doctrine);
$this->featureManager = $featureManager;
}
public function registerUrls(UrlContainerInterface $urls): void
{
/** @var Route[] $routes */
$routes = $this->doctrine->getRepository(Route::class)->findAll();
foreach ($routes as $route) {
try {
if (!$this->isRouteValidForSiteMap($route)) {
continue;
}
$urls->addUrl(
new UrlConcrete(
$this->urlGenerator->generate(
$route->getName(),
[],
UrlGeneratorInterface::ABSOLUTE_URL
)
),
'page'
);
} catch (\Exception $e) {
continue;
}
}
}
private function isRouteValidForSiteMap(Route $route): bool
{
if ($route->getVariablePattern()) {
return false;
}
if (!$route->getPage()) {
return false;
}
if ($route->getPage()->isConcept()) {
return false;
}
if ($route->getPage()->getFeature() && !$this->featureManager->isActive($route->getPage()->getFeature())) {
return false;
}
return true;
}
}