PrestaConcept
Nos réalisations
Nos métiers
  • Découvrez nos métiers
  • Développement web sur mesure

    Nous développons en méthode agile des back sous le framework PHP Symfony, des front en Angular.

  • Maintenance d'applications

    Maintien en condition opérationnelle de votre plateforme Symfony.

  • Expertise Symfony

    Coaching, formation, audit et conseil.

  • Hébergement et Infogérance

    Une expertise de l'hébergement depuis plus de 15 ans et l’infogérance de centaines de machines en production actuellement.

  • Qui sommes nous
  • Découvrez Prestaconcept
  • PrestaConcept

    Notre histoire, nos convictions, notre vision... Découvrez ce qui nous anime !

  • L'équipe

    Plus de 15 ans minimum d'expérience sur Symfony.

  • Nos engagements RSE

    Une société engagée pour un numérique responsable.

  • Nos convictions

    Co-construction, transparence.. Les principes qui guident nos collaborations !

  • Nous rejoindre

    Envie de nous rejoindre ? Consultez nos offres !

  • Blog
    J'ai un projet Nous contacter
    J'ai un projet Nous contacter Menu
    • Accueil
    • Blog
    • Tech
    • Comment re-générer le sitemap au changement d'une entité

    Blog

    Comment re-générer le sitemap au changement d'une entité

    php snippet symfony
    Yann Eugoné
    Yann Eugoné CTO
    Publié le mardi 9 novembre 2021

    Comment re-générer votre sitemap en asynchrone lorsque les modifications apportées en back-office l'impactent.

    Pré-requis

    Ce snippet s'appuie sur le package PrestaSitemapBundle.
    Vous pouvez retrouver les détails concernant cette librairie sur le billet associé.

    Et notamment sur une intégration possible entre ce bundle et le composant Messenger de Symfony.

    Cas d'usage

    Dans un sitemap, on retrouve 2 catégories d'URLs :

    Les URLs statiques:
    Elles pointent vers des routes simples : /contact, /about, ...
    Elles ne sont enregistrées qu'une seule fois.

    Les URLs dynamiques:
    Elles pointent vers des routes variabilisées : /blog/{date}/{slug}, /jobs/{slug}, ...
    Elles sont enregistrées autant de fois qu'il y a de jeux de variables.

    Les URLs dynamiques sont, par définition, sont amenées à changer.
    Si vous générez votre sitemap, il doit être rafraîchi régulièrement afin d'être à jour.

    Il y a plusieurs solutions pour cela, mais la plus efficace reste la ré-génération à la demande.

    Un listener pour les gouverner tous

    Dans le cas où vos jeux de variables proviennent d'entités ORM, il vous faut un moyen pour détecter les modifications apportées aux entités qui composent votre sitemap.
    Comme toujours, une multitude de solution est possible.
    Mais la plus simple reste la mise en place d'un listener, car :

    1. il sera appelé quel que soit le contexte
    2. il pourra traiter toutes les entités d'un seul bloc
    3. comme c'est un service et peut avoir des dépendances

    Le rôle de ce listener est d'analyser une transaction doctrine pour y trouver d'éventuels changements qui nécessiteraient de déclencher le dump du sitemap.

    <?php
    
    namespace App\Sitemap;
    
    use Doctrine\Common\EventSubscriber;
    use Doctrine\ORM\Event\OnFlushEventArgs;
    use Doctrine\ORM\Event\PostFlushEventArgs;
    use Doctrine\ORM\Events;
    use Presta\SitemapBundle\Messenger\DumpSitemapMessage;
    use Symfony\Component\Messenger\MessageBusInterface;
    
    /**
     * Ce listener doctrine analyse les entités créées/modifiées/supprimées
     * et décide s'il faut régénérer le sitemap.
     */
    final class TriggerSitemapDumpListener implements EventSubscriber
    {
        private bool $dispatch = false;
    
        public function __construct(
            private MessageBusInterface $bus,
        ) {
        }
    
        public function getSubscribedEvents(): array
        {
            return [Events::onFlush, Events::postFlush];
        }
    
        public function onFlush(OnFlushEventArgs $event): void
        {
            if ($this->dispatch) {
                return; // d'une certaine manière, le dump est déjà demandé
            }
    
            $unitOfWork = $event->getEntityManager()->getUnitOfWork();
    
            $analyze = \array_merge(
                $unitOfWork->getScheduledEntityInsertions(),
                $unitOfWork->getScheduledEntityUpdates(),
                $unitOfWork->getScheduledEntityDeletions(),
            );
            foreach ($analyze as $entity) {
                if ($entity /*todo $entity est à mettre dans le sitemap*/) {
                    $this->dispatch = true;
                    break; // trouver une seule entité est suffisant
                }
            }
        }
    
        public function postFlush(PostFlushEventArgs $event): void
        {
            if ($this->dispatch) {
                // le dump a été demandée, on le déclenche après que les modifications aient été persitées
                $this->bus->dispatch(new DumpSitemapMessage());
            }
        }
    }
    

    Vous avez dit asynchrone ?

    Jusqu'ici, nous-nous sommes contentés d'envoyer un message dans le bus, et Symfony messenger l'a probablement traité immédiatement : c'est son comportement par défaut.
    Si l'on souhaite que ce traitement se fasse de manière asynchrone, il nous faut configurer le composant pour qu'il "route" notre message par un transport supportant une forme d'asynchronicité.

    # config/packages/messenger.yaml
    framework:
        messenger:
            transports:
                async: "%env(MESSENGER_TRANSPORT_DSN)%"
            routing:
                'Presta\SitemapBundle\Messenger\DumpSitemapMessage':  async
    

    Blog

    Pour continuer votre lecture ...

    Tech

    Le pattern Décorateur avec Symfony

    Par Yann Eugoné 16/03/2022

    Apprenez à découper votre code devenu trop complexe avec le pattern décorateur, en vous aidant de Symfony.

    Lire la suite
    Tech

    Comment désactiver certains listeners lors de certaines commandes

    Par Yann Eugoné 11/01/2022

    Une solution simple et élégante, utilisant l'injection de services tagués, pour vous donner la possibilité de désactiver certains listeners lors de l'exécution de certaines commandes.

    Lire la suite
    Tech

    Le pattern Stratégie avec Symfony

    Par Maximilien Delangle 09/02/2023

    C'est un modèle de conception de logiciel qui permet de séparer l'algorithme d'une classe de son exécution. Il est utilisé pour résoudre les problèmes de complexité et de maintenance dans les applications.

    Lire la suite

    Vous avez un projet Laravel ?

    Nous sommes spécialisés en Symfony, et grâce à Web^ID, l’agence sœur du groupe Agile Invest, nous couvrons aussi toute l’expertise Laravel.

    Découvrir Web^ID

    Une question, un projet ?
    Planifiez un échange avec nous !

    Choisissez votre date
    PrestaConcept - Groupe Agile Invest
    5, imp. Morel, 69003 Lyon +33 (0)4 78 54 45 45
    Suivez-nous
    Ecoindex B

    Ce site internet est un site basse consommation. En savoir plus sur l'Ecoindex

    Nos réalisations

  • Logiciel de mise en conformité réglementaire
  • Application de suivi de production des centrales éoliennes
  • Outil d'aide à la décision
  • Portail client
  • Nos métiers

  • Développement sur-mesure
  • Reprise d'application Symfony
  • Expertise Symfony
  • Hébergement & Infogérance
  • Qui sommes-nous

  • PrestaConcept
  • Groupe Agile Invest
  • L'équipe
  • Engagement RSE
  • Blog

  • Tech
  • Méthodologie
  • PrestaConcept
  • RSE
  • © 2025 PrestaConcept
    Mentions légales Politique de confidentialité 🍪
    Retour en haut de page