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

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\PageModel;
  18. use Spatie\SchemaOrg\WebPage;
  19. use Symfony\Component\HttpFoundation\RequestStack;
  20. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  21. class CoreResponseContextFactory
  22. {
  23.     private ResponseContextAccessor $responseContextAccessor;
  24.     private EventDispatcherInterface $eventDispatcher;
  25.     private TokenChecker $tokenChecker;
  26.     private HtmlDecoder $htmlDecoder;
  27.     private RequestStack $requestStack;
  28.     private InsertTagParser $insertTagParser;
  29.     public function __construct(ResponseContextAccessor $responseContextAccessorEventDispatcherInterface $eventDispatcherTokenChecker $tokenCheckerHtmlDecoder $htmlDecoderRequestStack $requestStackInsertTagParser $insertTagParser)
  30.     {
  31.         $this->responseContextAccessor $responseContextAccessor;
  32.         $this->eventDispatcher $eventDispatcher;
  33.         $this->tokenChecker $tokenChecker;
  34.         $this->htmlDecoder $htmlDecoder;
  35.         $this->requestStack $requestStack;
  36.         $this->insertTagParser $insertTagParser;
  37.     }
  38.     public function createResponseContext(): ResponseContext
  39.     {
  40.         $context = new ResponseContext();
  41.         $this->responseContextAccessor->setResponseContext($context);
  42.         return $context;
  43.     }
  44.     public function createWebpageResponseContext(): ResponseContext
  45.     {
  46.         $context $this->createResponseContext();
  47.         $context->add($this->eventDispatcher);
  48.         $context->addLazy(HtmlHeadBag::class);
  49.         $context->addLazy(
  50.             JsonLdManager::class,
  51.             static function () use ($context) {
  52.                 $manager = new JsonLdManager($context);
  53.                 $manager->getGraphForSchema(JsonLdManager::SCHEMA_ORG)->add(new WebPage());
  54.                 return $manager;
  55.             }
  56.         );
  57.         return $context;
  58.     }
  59.     public function createContaoWebpageResponseContext(PageModel $pageModel): ResponseContext
  60.     {
  61.         $context $this->createWebpageResponseContext();
  62.         /** @var HtmlHeadBag $htmlHeadBag */
  63.         $htmlHeadBag $context->get(HtmlHeadBag::class);
  64.         /** @var JsonLdManager $jsonLdManager */
  65.         $jsonLdManager $context->get(JsonLdManager::class);
  66.         $title $this->htmlDecoder->inputEncodedToPlainText($pageModel->pageTitle ?: $pageModel->title ?: '');
  67.         $htmlHeadBag
  68.             ->setTitle($title ?: '')
  69.             ->setMetaDescription($this->htmlDecoder->inputEncodedToPlainText($pageModel->description ?: ''))
  70.         ;
  71.         if ($pageModel->robots) {
  72.             $htmlHeadBag->setMetaRobots($pageModel->robots);
  73.         }
  74.         if ($pageModel->enableCanonical && $pageModel->canonicalLink) {
  75.             $url $this->insertTagParser->replaceInline($pageModel->canonicalLink);
  76.             // Ensure absolute links
  77.             if (!preg_match('#^https?://#'$url)) {
  78.                 if (!$request $this->requestStack->getMainRequest()) {
  79.                     throw new \RuntimeException('The request stack did not contain a request');
  80.                 }
  81.                 $url $request->getSchemeAndHttpHost().$request->getBasePath().'/'.$url;
  82.             }
  83.             $htmlHeadBag->setCanonicalUri($url);
  84.         }
  85.         if ($pageModel->enableCanonical && $pageModel->canonicalKeepParams) {
  86.             $htmlHeadBag->setKeepParamsForCanonical(array_map('trim'explode(','$pageModel->canonicalKeepParams)));
  87.         }
  88.         $jsonLdManager
  89.             ->getGraphForSchema(JsonLdManager::SCHEMA_CONTAO)
  90.             ->set(
  91.                 new ContaoPageSchema(
  92.                     $title ?: '',
  93.                     (int) $pageModel->id,
  94.                     (bool) $pageModel->noSearch,
  95.                     (bool) $pageModel->protected,
  96.                     array_map('intval'array_filter((array) $pageModel->groups)),
  97.                     $this->tokenChecker->isPreviewMode()
  98.                 )
  99.             )
  100.         ;
  101.         return $context;
  102.     }
  103. }