vendor/pimcore/pimcore/bundles/CoreBundle/EventListener/Frontend/HardlinkCanonicalListener.php line 61

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Enterprise License (PEL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  * @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  * @license    http://www.pimcore.org/license     GPLv3 and PEL
  13.  */
  14. namespace Pimcore\Bundle\CoreBundle\EventListener\Frontend;
  15. use Pimcore\Bundle\CoreBundle\EventListener\Traits\PimcoreContextAwareTrait;
  16. use Pimcore\Http\Request\Resolver\DocumentResolver;
  17. use Pimcore\Http\Request\Resolver\PimcoreContextResolver;
  18. use Pimcore\Model\Document;
  19. use Pimcore\Model\Document\Hardlink\Wrapper\WrapperInterface;
  20. use Pimcore\Model\Site;
  21. use Pimcore\Model\Staticroute;
  22. use Pimcore\Tool\Frontend;
  23. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  24. use Symfony\Component\HttpFoundation\Request;
  25. use Symfony\Component\HttpFoundation\Response;
  26. use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
  27. use Symfony\Component\HttpKernel\KernelEvents;
  28. /**
  29.  * Sets canonical headers for hardlink documents
  30.  */
  31. class HardlinkCanonicalListener implements EventSubscriberInterface
  32. {
  33.     use PimcoreContextAwareTrait;
  34.     /**
  35.      * @var DocumentResolver
  36.      */
  37.     protected $documentResolver;
  38.     /**
  39.      * @param DocumentResolver $documentResolver
  40.      */
  41.     public function __construct(DocumentResolver $documentResolver)
  42.     {
  43.         $this->documentResolver $documentResolver;
  44.     }
  45.     /**
  46.      * @inheritDoc
  47.      */
  48.     public static function getSubscribedEvents()
  49.     {
  50.         return [
  51.             KernelEvents::RESPONSE => 'onKernelResponse'
  52.         ];
  53.     }
  54.     public function onKernelResponse(FilterResponseEvent $event)
  55.     {
  56.         $request $event->getRequest();
  57.         if (!$event->isMasterRequest()) {
  58.             return;
  59.         }
  60.         if (!$this->matchesPimcoreContext($requestPimcoreContextResolver::CONTEXT_DEFAULT)) {
  61.             return;
  62.         }
  63.         $document $this->documentResolver->getDocument($request);
  64.         if (!$document) {
  65.             return;
  66.         }
  67.         if ($document instanceof WrapperInterface && !Staticroute::getCurrentRoute()) {
  68.             $this->handleHardlink($request$event->getResponse(), $document);
  69.         }
  70.     }
  71.     /**
  72.      * @param Request $request
  73.      * @param Response $response
  74.      * @param Document $document
  75.      */
  76.     protected function handleHardlink(Request $requestResponse $responseDocument $document)
  77.     {
  78.         $canonical null;
  79.         // get the canonical (source) document
  80.         $hardlinkCanonicalSourceDocument Document::getById($document->getId());
  81.         if (Frontend::isDocumentInCurrentSite($hardlinkCanonicalSourceDocument)) {
  82.             $canonical $request->getSchemeAndHttpHost() . $hardlinkCanonicalSourceDocument->getFullPath();
  83.         } elseif (Site::isSiteRequest()) {
  84.             $sourceSite Frontend::getSiteForDocument($hardlinkCanonicalSourceDocument);
  85.             if ($sourceSite) {
  86.                 if ($sourceSite->getMainDomain()) {
  87.                     $sourceSiteRelPath preg_replace('@^' preg_quote($sourceSite->getRootPath(), '@') . '@'''$hardlinkCanonicalSourceDocument->getRealFullPath());
  88.                     $canonical $request->getScheme() . '://' $sourceSite->getMainDomain() . $sourceSiteRelPath;
  89.                 }
  90.             }
  91.         }
  92.         if ($canonical) {
  93.             $response->headers->set('Link''<' $canonical '>; rel="canonical"'false);
  94.         }
  95.     }
  96. }