Le sitemap est un outil facilitant le référencement de votre site sur les différents moteur de recherche, il est au format .xml
Le controller
Utilisation du terminal pour créer le controller:
symfony console make: controller SitemapController
Modifions un petit peu le code:
<?php
namespace App\Controller\Site;
use App\Service\SitemapService;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class SitemapController extends AbstractController
{
public function __construct(
private SitemapService $sitemapService,
)
{}
#[Route('/sitemap.xml', name: 'sitemap')]
public function index(): Response
{
$arrays = $this->sitemapService->generateRoutes();
$response = new Response(
$this->renderView('site/sitemap/sitemap.html.twig', [
'urls' => $arrays['urls'],
'hostname' => $arrays['hostname'],
]),200
);
$response->headers->set('Content-type', 'text/xml');
return $response;
}
}
Le service
<?php
namespace App\Service;
use App\Repository\CategoryRepository;
use App\Repository\ArticleRepository;
use DateTimeZone;
use DateTimeImmutable;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\RouterInterface;
class SitemapService
{
public function __construct(
private RequestStack $requestStack,
private RouterInterface $routerInterface,
private CategoryRepository $categoryRepository,
private ArticleRepository $articleRepository
){}
public function generateRoutes(): array
{
//?on retournera le tout dans un mega tableau
$arrays = [];
//?on recupere l'hôte
$arrays['hostname'] = $this->requestStack->getCurrentRequest()->getSchemeAndHttpHost();
//?il nous faut un tableau des différents urls
$urls = [];
//?on recupere la date au moment de la requete
$now = new DateTimeImmutable('now', new DateTimeZone('Europe/Paris'));
//?on recupere toutes les routes du projet
$allRoutesGeneratedByControllers = $this->routerInterface->getRouteCollection()->all();
//?on boucle sur les routes
foreach($allRoutesGeneratedByControllers as $key => $route){
//! les routes sans paramêtres commencent par site_
if(substr($key,0,5) == 'site_'){
//? on met dans le tableau les différentes route
$urls[] = [
'loc' => $this->routerInterface->generate($key),
'lastmod' => $now->format('Y-m-d'),
'changefreq' => "monthly", //monthly,daily
'priority' => 0.8
];
}
}
//! les autres routes un peu plus complexes
// #[Route('/mes-astuces/{categoryId}/{categorySlug}', name: 'mapped_my_tricks')]
$categories = $this->categoryRepository->findAll();
foreach($categories as $category){
$urls[] = [
'loc' => $this->routerInterface->generate('mapped_my_tricks', ['categoryId' => $category->getId(), 'categorySlug' => $category->getSlug()]),
'lastmod' => $category->getUpdatedAt()->format('Y-m-d'),
'changefreq' => "monthly",
'priority' => 0.8
];
}
$arrays['urls'] = $urls;
return $arrays;
}
}
Explications
- On récupére toutes les routes du projet
- Si la route commence par site_ on cré l'url dans le sitemap (donc les routes que vous voulez indexer doivent commencer par site_)
Le fichier twig
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
{% for url in urls %}
<url>
<loc>{{ hostname }}{{ url.loc }}</loc>
{% if url.lastmod is defined %}
<lastmod>{{ url.lastmod }}</lastmod>
{% endif %}
{% if url.changefreq is defined %}
<changefreq>{{ url.changefreq }}</changefreq>
{% endif %}
{% if url.priority is defined %}
<priority>{{ url.priority }}</priority>
{% endif %}
</url>
{% endfor %}
</urlset>