src/Hitso/Bundle/MultiSiteBundle/EventListener/SiteListener.php line 48

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4.  * @author Maciej Kaczmarek <maciej.kaczmarek@autentika.pl>
  5.  */
  6. namespace Hitso\Bundle\MultiSiteBundle\EventListener;
  7. use Hitso\Bundle\MultiSiteBundle\MultiSite\Site;
  8. use Hitso\Bundle\MultiSiteBundle\MultiSite\SiteCollection;
  9. use Hitso\Bundle\MultiSiteBundle\MultiSite\SiteContext;
  10. use Sonata\SeoBundle\Seo\SeoPageInterface;
  11. use Symfony\Component\HttpFoundation\RedirectResponse;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
  15. use Symfony\Component\HttpKernel\Event\GetResponseEvent;
  16. /**
  17.  * This class listens for incomming master request and resolves its the running site
  18.  */
  19. class SiteListener
  20. {
  21.     /** @var SiteContext */
  22.     private $context;
  23.     /** @var SeoPageInterface */
  24.     private $seoPage;
  25.     /**
  26.      * SiteListener constructor.
  27.      *
  28.      * @param SiteContext      $context
  29.      * @param SeoPageInterface $seoPage
  30.      */
  31.     public function __construct(SiteContext $contextSeoPageInterface $seoPage)
  32.     {
  33.         $this->context $context;
  34.         $this->seoPage $seoPage;
  35.     }
  36.     /**
  37.      * @param GetResponseEvent $event
  38.      *
  39.      * @throws \Hitso\Bundle\CommonBundle\Exception\InvalidArgumentException
  40.      * @throws \Hitso\Bundle\MultiSiteBundle\Exception\InvalidArgumentException
  41.      */
  42.     public function onKernelRequest(GetResponseEvent $event)
  43.     {
  44.         if (!$event->isMasterRequest()) {
  45.             return;
  46.         }
  47.         $request $event->getRequest();
  48.         $sites   $this->context->getSites();
  49.         $site $this->checkSettings($request$sites);
  50.         if ($site) {
  51.             $this->context->setRunningSite($site);
  52.             $request->attributes->set('_site'$site->getId());
  53.             // Set site_id (language version) if isContent is true
  54.             if (!$site->isContent()) {
  55.                 $siteId $request->query->get('_site');
  56.                 if ($siteId && $sites->has($siteId) && $sites->get($siteId)->isContent()) {
  57.                     $this->context->setContentSite($sites->get($siteId));
  58.                     $event->setResponse(new RedirectResponse($request->getPathInfo()));
  59.                 }
  60.             }
  61.             $this->updateSeoLocales($site);
  62.         } else {
  63.             $event->setResponse(new Response('Invalid site configuration!'403));
  64.         }
  65.     }
  66.     /**
  67.      * Check if site is configured
  68.      *
  69.      * @param Request        $request
  70.      * @param SiteCollection $sites
  71.      *
  72.      * @return Site|null
  73.      */
  74.     private function checkSettings(Request $requestSiteCollection $sites)
  75.     {
  76.         $host $request->getHost();
  77.         $port $request->getPort();
  78.         foreach ($sites as $site) {
  79.             if (
  80.                 // Check if requested site host and port is configured
  81.                 $site->getHost() && ($site->getHost() == $host || in_array($host$site->getAliases())) && (!$site->getPort() || $site->getPort() == $port) &&
  82.                 // Check if path is turned off or if path is correct
  83.                 (!$site->getPath() || == strpos($request->getPathInfo(), $site->getPath()))
  84.             ) {
  85.                 if ($site->getHost() !== $host) {
  86.                     $site->setHost($host);
  87.                 }
  88.                 return $site;
  89.             }
  90.         }
  91.         return null;
  92.     }
  93.     private function updateSeoLocales(Site $runningSite)
  94.     {
  95.         $sites $this->context->getSites();
  96.         $alternates = [];
  97.         foreach ($sites as $site) {
  98.             if ($site->isContent() && $site !== $runningSite) {
  99.                 $alternates[] = [
  100.                     'name'  => 'og:locale:alternate',
  101.                     'value' => $site->getLocale(),
  102.                 ];
  103.             }
  104.         }
  105.         if (null !== $runningSite->getLocale()) {
  106.             $this->seoPage->addMeta('property''og:locale'$runningSite->getLocale(), $alternates);
  107.         }
  108.     }
  109. }