src/EventListener/SitemapSubscriber.php line 58

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Repository\AttributeGroupRepository;
  4. use App\Repository\CourseRepository;
  5. use App\Repository\CourseTopicRepository;
  6. use App\Repository\ManualRepository;
  7. use App\Repository\NewsRepository;
  8. use App\Repository\OrganizerRepository;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  11. use Presta\SitemapBundle\Event\SitemapPopulateEvent;
  12. use Presta\SitemapBundle\Service\UrlContainerInterface;
  13. use Presta\SitemapBundle\Sitemap\Url\UrlConcrete;
  14. class SitemapSubscriber implements EventSubscriberInterface
  15. {
  16.     private CourseRepository $courseRepository;
  17.     private OrganizerRepository $organizerRepository;
  18.     private NewsRepository $newsRepository;
  19.     private ManualRepository $manualRepository;
  20.     private AttributeGroupRepository $attributeGroupRepository;
  21.     private CourseTopicRepository $courseTopicRepository;
  22.     public function __construct(
  23.         CourseRepository         $courseRepository,
  24.         OrganizerRepository      $organizerRepository,
  25.         NewsRepository           $newsRepository,
  26.         ManualRepository         $manualRepository,
  27.         AttributeGroupRepository $attributeGroupRepository,
  28.         CourseTopicRepository    $courseTopicRepository
  29.     )
  30.     {
  31.         $this->courseRepository $courseRepository;
  32.         $this->organizerRepository $organizerRepository;
  33.         $this->newsRepository $newsRepository;
  34.         $this->manualRepository $manualRepository;
  35.         $this->attributeGroupRepository $attributeGroupRepository;
  36.         $this->courseTopicRepository $courseTopicRepository;
  37.     }
  38.     /**
  39.      * @inheritdoc
  40.      */
  41.     public static function getSubscribedEvents()
  42.     {
  43.         return [
  44.             SitemapPopulateEvent::class => 'populate',
  45.         ];
  46.     }
  47.     /**
  48.      * @param SitemapPopulateEvent $event
  49.      */
  50.     public function populate(SitemapPopulateEvent $event): void
  51.     {
  52.         $this->registerNewsUrls($event->getUrlContainer(), $event->getUrlGenerator());
  53.         $this->registerManualUrls($event->getUrlContainer(), $event->getUrlGenerator());
  54.         $this->registerCourseUrls($event->getUrlContainer(), $event->getUrlGenerator());
  55.         $this->registerCourseTopicsUrls($event->getUrlContainer(), $event->getUrlGenerator());
  56.         $this->registerAttributeGroupsUrls($event->getUrlContainer(), $event->getUrlGenerator());
  57.         $this->registerOrganizerUrls($event->getUrlContainer(), $event->getUrlGenerator());
  58.     }
  59.     public function registerUrls($routeName$items$sectionNameUrlContainerInterface $urlsUrlGeneratorInterface $router$slugParamName 'slug'): void
  60.     {
  61.         foreach ($items as $item) {
  62.             if ($slugParamName == 'identifier') {
  63.                 $params = ['slug' => $item->getIdentifier()];
  64.             } else {
  65.                 $params = [$slugParamName => $item->getId()];
  66.             }
  67.             $urls->addUrl(
  68.                 new UrlConcrete(
  69.                     $router->generate(
  70.                         $routeName,
  71.                         $params,
  72.                         UrlGeneratorInterface::ABSOLUTE_URL
  73.                     )
  74.                 ),
  75.                 $sectionName
  76.             );
  77.         }
  78.     }
  79.     /**
  80.      * @param UrlContainerInterface $urls
  81.      * @param UrlGeneratorInterface $router
  82.      */
  83.     public function registerNewsUrls(UrlContainerInterface $urlsUrlGeneratorInterface $router): void
  84.     {
  85.         $items $this->newsRepository->findAll();
  86.         $this->registerUrls('news_detail'$items'news'$urls$router);
  87.     }
  88.     /**
  89.      * @param UrlContainerInterface $urls
  90.      * @param UrlGeneratorInterface $router
  91.      */
  92.     public function registerManualUrls(UrlContainerInterface $urlsUrlGeneratorInterface $router): void
  93.     {
  94.         $items $this->manualRepository->findAll();
  95.         $this->registerUrls('manual_detail'$items'manuals'$urls$router);
  96.     }
  97.     private function registerCourseUrls(UrlContainerInterface $urlsUrlGeneratorInterface $router)
  98.     {
  99.         $items $this->courseRepository->getLatestCourses();
  100.         $this->registerUrls('course_show'$items'courses'$urls$router'id');
  101.     }
  102.     private function registerCourseTopicsUrls(UrlContainerInterface $urlsUrlGeneratorInterface $router)
  103.     {
  104.         $items $this->courseTopicRepository->findAll();
  105.         $this->registerUrls('course_topic_index'$items'main_topics'$urls$router'identifier');
  106.     }
  107.     private function registerAttributeGroupsUrls(UrlContainerInterface $urlsUrlGeneratorInterface $router)
  108.     {
  109.         $items $this->attributeGroupRepository->findAll();
  110.         $this->registerUrls('attribute_group_index'$items'attribute_groups'$urls$router'identifier');
  111.     }
  112.     private function registerOrganizerUrls(UrlContainerInterface $urlsUrlGeneratorInterface $router)
  113.     {
  114.         $items $this->organizerRepository->findAll();
  115.         $this->registerUrls('organizer_detail'$items'organizers'$urls$router'id');
  116.     }
  117. }