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

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