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

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 Commercial License (PCL)
  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 PCL
  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\ResponseEvent;
  27. use Symfony\Component\HttpKernel\KernelEvents;
  28. /**
  29.  * Sets canonical headers for hardlink documents
  30.  *
  31.  * @internal
  32.  */
  33. class HardlinkCanonicalListener implements EventSubscriberInterface
  34. {
  35.     use PimcoreContextAwareTrait;
  36.     /**
  37.      * @param DocumentResolver $documentResolver
  38.      */
  39.     public function __construct(protected DocumentResolver $documentResolver)
  40.     {
  41.     }
  42.     /**
  43.      * {@inheritdoc}
  44.      */
  45.     public static function getSubscribedEvents()
  46.     {
  47.         return [
  48.             KernelEvents::RESPONSE => 'onKernelResponse',
  49.         ];
  50.     }
  51.     public function onKernelResponse(ResponseEvent $event)
  52.     {
  53.         $request $event->getRequest();
  54.         if (!$event->isMainRequest()) {
  55.             return;
  56.         }
  57.         if (!$this->matchesPimcoreContext($requestPimcoreContextResolver::CONTEXT_DEFAULT)) {
  58.             return;
  59.         }
  60.         $document $this->documentResolver->getDocument($request);
  61.         if (!$document) {
  62.             return;
  63.         }
  64.         if ($document instanceof WrapperInterface && !Staticroute::getCurrentRoute()) {
  65.             $this->handleHardlink($request$event->getResponse(), $document);
  66.         }
  67.     }
  68.     /**
  69.      * @param Request $request
  70.      * @param Response $response
  71.      * @param Document $document
  72.      */
  73.     protected function handleHardlink(Request $requestResponse $responseDocument $document)
  74.     {
  75.         $canonical null;
  76.         // get the canonical (source) document
  77.         $hardlinkCanonicalSourceDocument Document::getById($document->getId());
  78.         if (Frontend::isDocumentInCurrentSite($hardlinkCanonicalSourceDocument)) {
  79.             $canonical $request->getSchemeAndHttpHost() . $hardlinkCanonicalSourceDocument->getFullPath();
  80.         } elseif (Site::isSiteRequest()) {
  81.             $sourceSite Frontend::getSiteForDocument($hardlinkCanonicalSourceDocument);
  82.             if ($sourceSite) {
  83.                 if ($sourceSite->getMainDomain()) {
  84.                     $sourceSiteRelPath preg_replace('@^' preg_quote($sourceSite->getRootPath(), '@') . '@'''$hardlinkCanonicalSourceDocument->getRealFullPath());
  85.                     $canonical $request->getScheme() . '://' $sourceSite->getMainDomain() . $sourceSiteRelPath;
  86.                 }
  87.             }
  88.         }
  89.         if ($canonical) {
  90.             $response->headers->set('Link''<' $canonical '>; rel="canonical"'false);
  91.         }
  92.     }
  93. }