vendor/contao/core-bundle/src/Routing/ResponseContext/CoreResponseContextFactory.php line 74

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4.  * This file is part of Contao.
  5.  *
  6.  * (c) Leo Feyer
  7.  *
  8.  * @license LGPL-3.0-or-later
  9.  */
  10. namespace Contao\CoreBundle\Routing\ResponseContext;
  11. use Contao\CoreBundle\InsertTag\InsertTagParser;
  12. use Contao\CoreBundle\Routing\ResponseContext\HtmlHeadBag\HtmlHeadBag;
  13. use Contao\CoreBundle\Routing\ResponseContext\JsonLd\ContaoPageSchema;
  14. use Contao\CoreBundle\Routing\ResponseContext\JsonLd\JsonLdManager;
  15. use Contao\CoreBundle\Security\Authentication\Token\TokenChecker;
  16. use Contao\CoreBundle\String\HtmlDecoder;
  17. use Contao\CoreBundle\Util\UrlUtil;
  18. use Contao\PageModel;
  19. use Spatie\SchemaOrg\WebPage;
  20. use Symfony\Component\HttpFoundation\RequestStack;
  21. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  22. class CoreResponseContextFactory
  23. {
  24.     private ResponseContextAccessor $responseContextAccessor;
  25.     private EventDispatcherInterface $eventDispatcher;
  26.     private TokenChecker $tokenChecker;
  27.     private HtmlDecoder $htmlDecoder;
  28.     private RequestStack $requestStack;
  29.     private InsertTagParser $insertTagParser;
  30.     public function __construct(ResponseContextAccessor $responseContextAccessorEventDispatcherInterface $eventDispatcherTokenChecker $tokenCheckerHtmlDecoder $htmlDecoderRequestStack $requestStackInsertTagParser $insertTagParser)
  31.     {
  32.         $this->responseContextAccessor $responseContextAccessor;
  33.         $this->eventDispatcher $eventDispatcher;
  34.         $this->tokenChecker $tokenChecker;
  35.         $this->htmlDecoder $htmlDecoder;
  36.         $this->requestStack $requestStack;
  37.         $this->insertTagParser $insertTagParser;
  38.     }
  39.     public function createResponseContext(): ResponseContext
  40.     {
  41.         $context = new ResponseContext();
  42.         $this->responseContextAccessor->setResponseContext($context);
  43.         return $context;
  44.     }
  45.     public function createWebpageResponseContext(): ResponseContext
  46.     {
  47.         $context $this->createResponseContext();
  48.         $context->add($this->eventDispatcher);
  49.         $context->addLazy(HtmlHeadBag::class);
  50.         $context->addLazy(
  51.             JsonLdManager::class,
  52.             static function () use ($context) {
  53.                 $manager = new JsonLdManager($context);
  54.                 $manager->getGraphForSchema(JsonLdManager::SCHEMA_ORG)->add(new WebPage());
  55.                 return $manager;
  56.             }
  57.         );
  58.         return $context;
  59.     }
  60.     public function createContaoWebpageResponseContext(PageModel $pageModel): ResponseContext
  61.     {
  62.         $context $this->createWebpageResponseContext();
  63.         /** @var HtmlHeadBag $htmlHeadBag */
  64.         $htmlHeadBag $context->get(HtmlHeadBag::class);
  65.         /** @var JsonLdManager $jsonLdManager */
  66.         $jsonLdManager $context->get(JsonLdManager::class);
  67.         $title $this->htmlDecoder->inputEncodedToPlainText($pageModel->pageTitle ?: $pageModel->title ?: '');
  68.         $htmlHeadBag
  69.             ->setTitle($title ?: '')
  70.             ->setMetaDescription($this->htmlDecoder->inputEncodedToPlainText($pageModel->description ?: ''))
  71.         ;
  72.         if ($pageModel->robots) {
  73.             $htmlHeadBag->setMetaRobots($pageModel->robots);
  74.         }
  75.         if ($pageModel->enableCanonical && $pageModel->canonicalLink) {
  76.             $url $this->insertTagParser->replaceInline($pageModel->canonicalLink);
  77.             // Ensure absolute links
  78.             if (!preg_match('#^https?://#'$url)) {
  79.                 if (!$request $this->requestStack->getMainRequest()) {
  80.                     throw new \RuntimeException('The request stack did not contain a request');
  81.                 }
  82.                 $url UrlUtil::makeAbsolute($url$request->getUri());
  83.             }
  84.             $htmlHeadBag->setCanonicalUri($url);
  85.         }
  86.         if ($pageModel->enableCanonical && $pageModel->canonicalKeepParams) {
  87.             $htmlHeadBag->setKeepParamsForCanonical(array_map('trim'explode(','$pageModel->canonicalKeepParams)));
  88.         }
  89.         $jsonLdManager
  90.             ->getGraphForSchema(JsonLdManager::SCHEMA_CONTAO)
  91.             ->set(
  92.                 new ContaoPageSchema(
  93.                     $title ?: '',
  94.                     (int) $pageModel->id,
  95.                     (bool) $pageModel->noSearch,
  96.                     (bool) $pageModel->protected,
  97.                     array_map('intval'array_filter((array) $pageModel->groups)),
  98.                     $this->tokenChecker->isPreviewMode()
  99.                 )
  100.             )
  101.         ;
  102.         return $context;
  103.     }
  104. }