src/Service/SEOService.php line 118

  1. <?php
  2. namespace App\Service;
  3. use App\Entity\Category;
  4. use App\Entity\Magazine;
  5. use App\Entity\News;
  6. use App\Entity\Product;
  7. use App\Entity\ProductCategory;
  8. use App\Entity\ProductType;
  9. use App\Entity\Recipe;
  10. use App\Repository\CategoryRepository;
  11. use App\Repository\MagazineRepository;
  12. use App\Repository\NewsRepository;
  13. use App\Repository\ProductCategoryRepository;
  14. use App\Repository\ProductRepository;
  15. use App\Repository\ProductTypeRepository;
  16. use App\Repository\RecipeRepository;
  17. use Doctrine\ORM\EntityManager;
  18. use Doctrine\ORM\EntityManagerInterface;
  19. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  20. use Symfony\Component\Routing\Router;
  21. use Symfony\Component\Routing\RouterInterface;
  22. use Symfony\Component\Translation\Translator;
  23. use Symfony\Contracts\Translation\TranslatorInterface;
  24. class SEOService
  25. {
  26.     /** @var EntityManager */
  27.     private $em;
  28.     /** @var Router */
  29.     private $router;
  30.     /** @var Translator  */
  31.     private $translator;
  32.     public function __construct(EntityManagerInterface $emRouterInterface $routerTranslatorInterface $translator)
  33.     {
  34.         $this->em $em;
  35.         $this->router $router;
  36.         $this->translator $translator;
  37.     }
  38.     /**
  39.      * Genera dinamicamente la sitemap
  40.      */
  41.     public function generateSitemap($locale)
  42.     {
  43.         $xml = new \SimpleXMLElement('<urlset/>');
  44.         $xml->addAttribute('xmlns''http://www.sitemaps.org/schemas/sitemap/0.9');
  45.         $xml->addAttribute('xmlns:xmlns:xsi''http://www.w3.org/2001/XMLSchema-instance');
  46.         $xml->addAttribute('xmlns:xsi:schemaLocation''http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd');
  47.         // PAGINE FISSE
  48.         $baseRoutes = [
  49.             ['homepage'1.00],
  50. //            ['app_configurator', 0.90],
  51.             ['app_customer_service'0.70],
  52.             ['about'0.70],
  53.             ['app_faq'0.50],
  54.         ];
  55.         if (in_array($locale, [
  56.             'it',
  57.         ])) {
  58.             $baseRoutes array_merge($baseRoutes, [
  59.                 ['app_wheretobuy'0.80],
  60.                 ['app_magazine_index'0.70],
  61.                 ['app_news_index'0.70],
  62.                 ['app_sponsor_index'0.70],
  63.                 ['app_recipes'0.70],
  64.                 ['app_work_with_us'0.40],
  65.             ]);
  66.         }
  67.         foreach ($baseRoutes as $baseRoute) {
  68.             $urlXml $xml->addChild('url');
  69.             $url $this->router->generate($baseRoute[0], [
  70.                 '_locale' => $locale
  71.             ], Router::ABSOLUTE_URL);
  72.             $urlXml->addChild('loc'$url);
  73.             $urlXml->addChild('changefreq''weekly');
  74.             $urlXml->addChild('priority'$baseRoute[1]);
  75.         }
  76.         // PRODUCTS
  77.         /** @var ProductTypeRepository $productTypeRepo */
  78.         $productTypeRepo $this->em->getRepository(ProductType::class);
  79.         $productTypes $productTypeRepo->findBy([
  80.             'locale' => $locale,
  81.             'enabled' => true,
  82.         ]);
  83.         /** @var ProductType $productType */
  84.         foreach ($productTypes as $productType) {
  85.             if ($locale == 'it' && $productType->getSlug() == 'ortofrutta') {
  86.                 $urlXml $xml->addChild('url');
  87.                 $url $this->router->generate('app_show_category_ortofrutta', [
  88.                     '_locale' => $locale,
  89.                 ], Router::ABSOLUTE_URL);
  90.                 $urlXml->addChild('loc'$url);
  91.                 $urlXml->addChild('changefreq''weekly');
  92.                 $urlXml->addChild('priority'0.80);
  93.             } elseif ($locale == 'it' && $productType->getSlug() == 'kroccanti') {
  94.                 $urlXml $xml->addChild('url');
  95.                 $url $this->router->generate('kroccanti', [
  96.                     '_locale' => $locale,
  97.                 ], Router::ABSOLUTE_URL);
  98.                 $urlXml->addChild('loc'$url);
  99.                 $urlXml->addChild('changefreq''weekly');
  100.                 $urlXml->addChild('priority'0.80);
  101.             } else {
  102.                 $urlXml $xml->addChild('url');
  103.                 $url $this->router->generate('app_show_category', [
  104.                     '_locale' => $locale,
  105.                     'category_slug' => $productType->getSlug()
  106.                 ], Router::ABSOLUTE_URL);
  107.                 $urlXml->addChild('loc'$url);
  108.                 $urlXml->addChild('changefreq''weekly');
  109.                 $urlXml->addChild('priority'0.80);
  110.             }
  111.         }
  112.         /** @var ProductRepository $productRepo */
  113.         $productRepo $this->em->getRepository(Product::class);
  114.         $products $productRepo->findBy([
  115.             'locale' => $locale,
  116.             'isEnabled' => true,
  117.         ]);
  118.         /** @var Product $product */
  119.         foreach ($products as $product) {
  120.             if ($locale == 'it' && $product->getType()->getSlug() == 'ortofrutta') {
  121.                 $urlXml $xml->addChild('url');
  122.                 $url $this->router->generate('app_show_product_ortofrutta', [
  123.                     '_locale' => $locale,
  124.                     'product_slug' => $product->getSlug()
  125.                 ], Router::ABSOLUTE_URL);
  126.                 $urlXml->addChild('loc'$url);
  127.                 $urlXml->addChild('changefreq''weekly');
  128.                 $urlXml->addChild('priority'0.80);
  129. //            } elseif ($locale == 'it' && $product->getType()->getSlug() == 'kroccanti') {
  130. //                $urlXml = $xml->addChild('url');
  131. //                $url = $this->router->generate('app_show_product', [
  132. //                    '_locale' => $locale,
  133. //                    'category_slug' => $product->getType()->getProductType()->getSlug(),
  134. //                    'product_slug' => $product->getSlug()
  135. //                ], Router::ABSOLUTE_URL);
  136. //                $urlXml->addChild('loc', $url);
  137. //                $urlXml->addChild('changefreq', 'weekly');
  138. //                $urlXml->addChild('priority', 0.80);
  139.             } else {
  140.                 $urlXml $xml->addChild('url');
  141.                 $url $this->router->generate('app_show_product', [
  142.                     '_locale' => $locale,
  143.                     'category_slug' => $product->getType()->getProductType()->getSlug(),
  144.                     'product_slug' => $product->getSlug()
  145.                 ], Router::ABSOLUTE_URL);
  146.                 $urlXml->addChild('loc'$url);
  147.                 $urlXml->addChild('changefreq''weekly');
  148.                 $urlXml->addChild('priority'0.80);
  149.             }
  150.         }
  151.         // MAGAZINE
  152.         if (in_array($locale, [
  153.             'it',
  154.         ])) {
  155.             /** @var ProductRepository $productRepo */
  156.             $magazineRepo $this->em->getRepository(Magazine::class);
  157.             $magazines $magazineRepo->findBy([
  158.                 'locale' => $locale,
  159.                 'isEnabled' => true,
  160.                 'type' => 'MAGAZINE',
  161.             ]);
  162.             /** @var Magazine $magazine */
  163.             foreach ($magazines as $magazine) {
  164.                 $urlXml $xml->addChild('url');
  165.                 $url $this->router->generate('app_magazine_detail', [
  166.                     '_locale' => $locale,
  167.                     'slug' => $magazine->getSlug()
  168.                 ], Router::ABSOLUTE_URL);
  169.                 $urlXml->addChild('loc'$url);
  170.                 $urlXml->addChild('changefreq''weekly');
  171.                 $urlXml->addChild('priority'0.80);
  172.             }
  173.             $magazines $magazineRepo->findBy([
  174.                 'locale' => $locale,
  175.                 'isEnabled' => true,
  176.                 'type' => 'SPONSOR',
  177.             ]);
  178.             /** @var Magazine $magazine */
  179.             foreach ($magazines as $magazine) {
  180.                 $urlXml $xml->addChild('url');
  181.                 $url $this->router->generate('app_sponsor_detail', [
  182.                     '_locale' => $locale,
  183.                     'slug' => $magazine->getSlug()
  184.                 ], Router::ABSOLUTE_URL);
  185.                 $urlXml->addChild('loc'$url);
  186.                 $urlXml->addChild('changefreq''weekly');
  187.                 $urlXml->addChild('priority'0.80);
  188.             }
  189.             $magazines $magazineRepo->findBy([
  190.                 'locale' => $locale,
  191.                 'isEnabled' => true,
  192.                 'type' => 'NEWS',
  193.             ]);
  194.             /** @var Magazine $magazine */
  195.             foreach ($magazines as $magazine) {
  196.                 $urlXml $xml->addChild('url');
  197.                 $url $this->router->generate('app_news_detail', [
  198.                     '_locale' => $locale,
  199.                     'slug' => $magazine->getSlug()
  200.                 ], Router::ABSOLUTE_URL);
  201.                 $urlXml->addChild('loc'$url);
  202.                 $urlXml->addChild('changefreq''weekly');
  203.                 $urlXml->addChild('priority'0.80);
  204.             }
  205.         }
  206.         // RECIPES
  207.         if (in_array($locale, [
  208.             'it',
  209.         ])) {
  210.             /** @var RecipeRepository $recipeRepo */
  211.             $recipeRepo $this->em->getRepository(Recipe::class);
  212.             $recipes $recipeRepo->findBy([
  213.                 'locale' => $locale,
  214.                 'isEnabled' => true,
  215.             ]);
  216.             /** @var Recipe $recipe */
  217.             foreach ($recipes as $recipe) {
  218.                 $urlXml $xml->addChild('url');
  219.                 $url $this->router->generate('app_recipes_detail', [
  220.                     '_locale' => $locale,
  221.                     'slug' => $recipe->getSlug()
  222.                 ], Router::ABSOLUTE_URL);
  223.                 $urlXml->addChild('loc'$url);
  224.                 $urlXml->addChild('changefreq''weekly');
  225.                 $urlXml->addChild('priority'0.80);
  226.             }
  227.         }
  228.         return $xml->asXML();
  229.     }
  230.     /**
  231.      * Genera dinamicamente la sitemap
  232.      */
  233.     public function generateSitemapDE($locale)
  234.     {
  235.         $xml = new \SimpleXMLElement('<urlset/>');
  236.         $xml->addAttribute('xmlns''http://www.sitemaps.org/schemas/sitemap/0.9');
  237.         $xml->addAttribute('xmlns:xmlns:xsi''http://www.w3.org/2001/XMLSchema-instance');
  238.         $xml->addAttribute('xmlns:xsi:schemaLocation''http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd');
  239.         // PAGINE FISSE
  240.         $baseRoutes = [
  241.             ['homepage'1.00]
  242.         ];
  243.         foreach ($baseRoutes as $baseRoute) {
  244.             $urlXml $xml->addChild('url');
  245.             $url $this->router->generate($baseRoute[0], [
  246.                 '_locale' => $locale
  247.             ], Router::ABSOLUTE_URL);
  248.             $urlXml->addChild('loc'$url);
  249.             $urlXml->addChild('changefreq''weekly');
  250.             $urlXml->addChild('priority'$baseRoute[1]);
  251.         }
  252.         
  253.         return $xml->asXML();
  254.     }
  255. }