Créer un sitemap

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

  1. On récupére toutes les routes du projet
  2. 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>