vendor/pimcore/pimcore/bundles/CoreBundle/EventListener/Frontend/StaticPageGeneratorListener.php line 70

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\Bundle\CoreBundle\EventListener\Traits\StaticPageContextAwareTrait;
  17. use Pimcore\Config;
  18. use Pimcore\Document\StaticPageGenerator;
  19. use Pimcore\Event\DocumentEvents;
  20. use Pimcore\Event\Model\DocumentEvent;
  21. use Pimcore\Http\Request\Resolver\DocumentResolver;
  22. use Pimcore\Http\Request\Resolver\PimcoreContextResolver;
  23. use Pimcore\Http\RequestHelper;
  24. use Pimcore\Logger;
  25. use Pimcore\Model\Document\Page;
  26. use Pimcore\Model\Document\PageSnippet;
  27. use Pimcore\Tool\Storage;
  28. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  29. use Symfony\Component\HttpFoundation\Response;
  30. use Symfony\Component\HttpKernel\Event\RequestEvent;
  31. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  32. use Symfony\Component\HttpKernel\KernelEvents;
  33. /**
  34.  * @internal
  35.  */
  36. class StaticPageGeneratorListener implements EventSubscriberInterface
  37. {
  38.     use PimcoreContextAwareTrait;
  39.     use StaticPageContextAwareTrait;
  40.     public function __construct(
  41.         protected StaticPageGenerator $staticPageGenerator,
  42.         protected DocumentResolver $documentResolver,
  43.         protected RequestHelper $requestHelper,
  44.         private Config $config
  45.     ) {
  46.     }
  47.     /**
  48.      * {@inheritdoc}
  49.      */
  50.     public static function getSubscribedEvents()
  51.     {
  52.         return [
  53.             DocumentEvents::POST_ADD => 'onPostAddUpdateDeleteDocument',
  54.             DocumentEvents::POST_DELETE => 'onPostAddUpdateDeleteDocument',
  55.             DocumentEvents::POST_UPDATE => 'onPostAddUpdateDeleteDocument',
  56.             KernelEvents::REQUEST => ['onKernelRequest'580], //this must run before targeting listener
  57.             KernelEvents::RESPONSE => ['onKernelResponse', -120], //this must run after code injection listeners
  58.         ];
  59.     }
  60.     /**
  61.      * @param RequestEvent $event
  62.      */
  63.     public function onKernelRequest(RequestEvent $event)
  64.     {
  65.         $request $event->getRequest();
  66.         if (!$event->isMainRequest()) {
  67.             return;
  68.         }
  69.         if ($this->requestHelper->isFrontendRequestByAdmin($request)) {
  70.             return;
  71.         }
  72.         $config $this->config['documents'];
  73.         if (!$config['static_page_router']['enabled']) {
  74.             return;
  75.         }
  76.         $routePattern $config['static_page_router']['route_pattern'];
  77.         if (!empty($routePattern) && !@preg_match($routePattern$request->getPathInfo())) {
  78.             return;
  79.         }
  80.         $storage Storage::get('document_static');
  81.         try {
  82.             $filename urldecode($request->getPathInfo()) . '.html';
  83.             if ($storage->fileExists($filename)) {
  84.                 $content $storage->read($filename);
  85.                 $date date(\DateTime::ISO8601$storage->lastModified($filename));
  86.                 $reponse = new Response(
  87.                     $contentResponse::HTTP_OK, [
  88.                     'Content-Type' => 'text/html',
  89.                     'X-Pimcore-Static-Page-Last-Modified' => $date,
  90.                 ]
  91.                 );
  92.                 $event->setResponse($reponse);
  93.             }
  94.         } catch (\Exception $e) {
  95.             Logger::error($e->getMessage());
  96.         }
  97.     }
  98.     /**
  99.      * @param ResponseEvent $event
  100.      */
  101.     public function onKernelResponse(ResponseEvent $event)
  102.     {
  103.         $request $event->getRequest();
  104.         if (!$event->isMainRequest()) {
  105.             return;
  106.         }
  107.         if (\Pimcore\Tool::isFrontendRequestByAdmin($request)) {
  108.             return;
  109.         }
  110.         //return if request is from StaticPageGenerator
  111.         if ($request->attributes->has('pimcore_static_page_generator')) {
  112.             return;
  113.         }
  114.         // only inject analytics code on non-admin requests
  115.         if (!$this->matchesPimcoreContext($requestPimcoreContextResolver::CONTEXT_DEFAULT)
  116.             && !$this->matchesStaticPageContext($request)) {
  117.             return;
  118.         }
  119.         $document $this->documentResolver->getDocument();
  120.         if ($document instanceof Page && $document->getStaticGeneratorEnabled()) {
  121.             $response $event->getResponse()->getContent();
  122.             $this->staticPageGenerator->generate($document, ['response' => $response]);
  123.         }
  124.     }
  125.     /**
  126.      * @param DocumentEvent $e
  127.      */
  128.     public function onPostAddUpdateDeleteDocument(DocumentEvent $e)
  129.     {
  130.         $document $e->getDocument();
  131.         if ($e->hasArgument('saveVersionOnly') || $e->hasArgument('autoSave')) {
  132.             return;
  133.         }
  134.         if ($document instanceof PageSnippet) {
  135.             try {
  136.                 if ($document->getStaticGeneratorEnabled()
  137.                     || $this->staticPageGenerator->pageExists($document)) {
  138.                     $this->staticPageGenerator->remove($document);
  139.                 }
  140.             } catch (\Exception $e) {
  141.                 Logger::error($e);
  142.                 return;
  143.             }
  144.         }
  145.     }
  146. }