<?php
namespace App\Controller\Front;
use App\Repository\ArticleRepository;
use App\Repository\CourseRepository;
use App\Repository\UserRepository;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class SitemapController extends AbstractController
{
#[Route('/sitemap.xml', name: 'sitemap')]
public function sitemap(CourseRepository $courseRepo, ArticleRepository $articleRepository, UserRepository $userRepository, RouterInterface $router)
{
$dom = new \DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true;
$urlset = $dom->createElement('urlset');
$urlset->setAttribute('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9');
$locales = ['fr', 'en', 'es', 'pt', 'it', 'de', 'sv', 'nl'];
// ✅ Routes statiques
$staticRoutes = ['homepage', 'user_login', 'membership_presentation', 'courses', 'directory', 'blog', 'tutos'];
foreach ($staticRoutes as $routeName) {
foreach ($locales as $locale) {
$url = $router->generate($routeName, ['_locale' => $locale], RouterInterface::ABSOLUTE_URL);
$urlNode = $dom->createElement('url');
$urlNode->appendChild($dom->createElement('loc', $url));
$urlNode->appendChild($dom->createElement('changefreq', 'weekly'));
$urlNode->appendChild($dom->createElement('priority', '0.8'));
$urlset->appendChild($urlNode);
}
}
// ✅ Routes dynamiques (cours)
foreach ($courseRepo->findActiveCourses() as $course) {
foreach ($locales as $locale) {
$url = $router->generate('view_course', [
'token' => $course->getToken(),
'_locale' => $locale,
], RouterInterface::ABSOLUTE_URL);
$urlNode = $dom->createElement('url');
$urlNode->appendChild($dom->createElement('loc', $url));
$urlNode->appendChild($dom->createElement('lastmod', date('c')));
$urlNode->appendChild($dom->createElement('changefreq', 'weekly'));
$urlNode->appendChild($dom->createElement('priority', '0.8'));
$urlset->appendChild($urlNode);
}
}
// ✅ Routes dynamiques (articles)
foreach ($locales as $locale) {
foreach ($articleRepository->getLatestNews($locale)->getResult() as $article) {
$url = $router->generate('show_article', [
'slug' => $article->getSlug(),
'_locale' => $locale,
], RouterInterface::ABSOLUTE_URL);
$urlNode = $dom->createElement('url');
$urlNode->appendChild($dom->createElement('loc', $url));
$urlNode->appendChild($dom->createElement('lastmod', date('c')));
$urlNode->appendChild($dom->createElement('changefreq', 'weekly'));
$urlNode->appendChild($dom->createElement('priority', '0.8'));
$urlset->appendChild($urlNode);
}
}
// ✅ Routes dynamiques (pros)
foreach ($userRepository->findPros() as $pro) {
foreach ($locales as $locale) {
$url = $router->generate('view_pro', [
'slug' => $pro->getSlug(),
'type' => $pro->getProType(),
'_locale' => $locale,
], RouterInterface::ABSOLUTE_URL);
$urlNode = $dom->createElement('url');
$urlNode->appendChild($dom->createElement('loc', $url));
$urlNode->appendChild($dom->createElement('lastmod', date('c')));
$urlNode->appendChild($dom->createElement('changefreq', 'weekly'));
$urlNode->appendChild($dom->createElement('priority', '0.8'));
$urlset->appendChild($urlNode);
}
}
$dom->appendChild($urlset);
return new Response($dom->saveXML(), 200, [
'Content-Type' => 'application/xml',
]);
}
}