vendor/pimcore/pimcore/bundles/CoreBundle/EventListener/ResponseExceptionListener.php line 76

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 Enterprise License (PEL)
  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 PEL
  13.  */
  14. namespace Pimcore\Bundle\CoreBundle\EventListener;
  15. use Pimcore\Bundle\CoreBundle\EventListener\Traits\PimcoreContextAwareTrait;
  16. use Pimcore\Config;
  17. use Pimcore\Db\ConnectionInterface;
  18. use Pimcore\Document\Renderer\DocumentRenderer;
  19. use Pimcore\Http\Exception\ResponseException;
  20. use Pimcore\Http\Request\Resolver\PimcoreContextResolver;
  21. use Pimcore\Model\Document;
  22. use Pimcore\Model\Site;
  23. use Pimcore\Templating\Renderer\ActionRenderer;
  24. use Psr\Log\LoggerAwareTrait;
  25. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  26. use Symfony\Component\HttpFoundation\Request;
  27. use Symfony\Component\HttpFoundation\Response;
  28. use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
  29. use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
  30. use Symfony\Component\HttpKernel\KernelEvents;
  31. class ResponseExceptionListener implements EventSubscriberInterface
  32. {
  33.     use LoggerAwareTrait;
  34.     use PimcoreContextAwareTrait;
  35.     /**
  36.      * @var ActionRenderer
  37.      */
  38.     protected $documentRenderer;
  39.     /**
  40.      * @var bool
  41.      */
  42.     protected $renderErrorPage true;
  43.     /**
  44.      * @var ConnectionInterface
  45.      */
  46.     protected $db;
  47.     /**
  48.      * @param DocumentRenderer $documentRenderer
  49.      * @param ConnectionInterface $db
  50.      * @param bool $renderErrorPage
  51.      */
  52.     public function __construct(DocumentRenderer $documentRendererConnectionInterface $db$renderErrorPage true)
  53.     {
  54.         $this->documentRenderer $documentRenderer;
  55.         $this->renderErrorPage = (bool)$renderErrorPage;
  56.         $this->db $db;
  57.     }
  58.     /**
  59.      * @inheritDoc
  60.      */
  61.     public static function getSubscribedEvents()
  62.     {
  63.         return [
  64.             KernelEvents::EXCEPTION => 'onKernelException'
  65.         ];
  66.     }
  67.     public function onKernelException(GetResponseForExceptionEvent $event)
  68.     {
  69.         $exception $event->getException();
  70.         // handle ResponseException (can be used from any context)
  71.         if ($exception instanceof ResponseException) {
  72.             $event->setResponse($exception->getResponse());
  73.             // a response was explicitely set -> do not continue to error page
  74.             return;
  75.         }
  76.         // further checks are only valid for default context
  77.         $request $event->getRequest();
  78.         if ($this->matchesPimcoreContext($requestPimcoreContextResolver::CONTEXT_DEFAULT)) {
  79.             if ($this->renderErrorPage) {
  80.                 $this->handleErrorPage($event);
  81.             }
  82.         }
  83.     }
  84.     protected function handleErrorPage(GetResponseForExceptionEvent $event)
  85.     {
  86.         if (\Pimcore::inDebugMode()) {
  87.             return;
  88.         }
  89.         $exception $event->getException();
  90.         $statusCode 500;
  91.         $headers = [];
  92.         if ($exception instanceof HttpExceptionInterface) {
  93.             $statusCode $exception->getStatusCode();
  94.             $headers $exception->getHeaders();
  95.         }
  96.         $errorPath Config::getSystemConfig()->documents->error_pages->default;
  97.         if (Site::isSiteRequest()) {
  98.             $site Site::getCurrentSite();
  99.             $errorPath $site->getErrorDocument();
  100.         }
  101.         $this->logToHttpErrorLog($event->getRequest(), $statusCode);
  102.         // Error page rendering
  103.         if (empty($errorPath)) {
  104.             $errorPath '/';
  105.         }
  106.         $document Document::getByPath($errorPath);
  107.         if (!$document instanceof Document\Page) {
  108.             // default is home
  109.             $document Document::getById(1);
  110.         }
  111.         try {
  112.             $response $this->documentRenderer->render($document, [
  113.                 'exception' => $exception
  114.             ]);
  115.         } catch (\Exception $e) {
  116.             // we are even not able to render the error page, so we send the client a unicorn
  117.             $response 'Page not found. ðŸ¦„';
  118.             $this->logger->emergency('Unable to render error page, exception thrown');
  119.             $this->logger->emergency($e);
  120.         }
  121.         $event->setResponse(new Response($response$statusCode$headers));
  122.     }
  123.     protected function logToHttpErrorLog(Request $request$statusCode)
  124.     {
  125.         $uri $request->getUri();
  126.         $exists $this->db->fetchOne('SELECT date FROM http_error_log WHERE uri = ?'$uri);
  127.         if ($exists) {
  128.             $this->db->query('UPDATE http_error_log SET `count` = `count` + 1, date = ? WHERE uri = ?', [time(), $uri]);
  129.         } else {
  130.             $this->db->insert('http_error_log', [
  131.                 'uri' => $uri,
  132.                 'code' => (int) $statusCode,
  133.                 'parametersGet' => serialize($_GET),
  134.                 'parametersPost' => serialize($_POST),
  135.                 'cookies' => serialize($_COOKIE),
  136.                 'serverVars' => serialize($_SERVER),
  137.                 'date' => time(),
  138.                 'count' => 1
  139.             ]);
  140.         }
  141.     }
  142. }