src/Services/ErrorService.php line 73

Open in your IDE?
  1. <?php
  2. namespace App\Services;
  3. use PhpParser\Comment\Doc;
  4. use Pimcore\Bundle\CoreBundle\EventListener\PimcoreContextListener;
  5. use Pimcore\Bundle\CoreBundle\EventListener\Traits\PimcoreContextAwareTrait;
  6. use Pimcore\Config;
  7. use Pimcore\Db\ConnectionInterface;
  8. use Pimcore\Document\Renderer\DocumentRenderer;
  9. use Pimcore\Http\Request\Resolver\PimcoreContextResolver;
  10. use Pimcore\Model\Document;
  11. use Pimcore\Model\Site;
  12. use Psr\Log\LoggerAwareTrait;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  17. use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
  18. use Symfony\Component\HttpKernel\KernelEvents;
  19. use Pimcore\Http\Exception\ResponseException;
  20. class ErrorService implements EventSubscriberInterface
  21. {
  22.     use LoggerAwareTrait;
  23.     use PimcoreContextAwareTrait;
  24.     /**
  25.      * @var DocumentRenderer
  26.      */
  27.     protected $documentRenderer;
  28.     /**
  29.      * @var bool
  30.      */
  31.     protected $renderErrorPage true;
  32.     /**
  33.      * @var Config
  34.      */
  35.     protected $config;
  36.     /**
  37.      * @var ConnectionInterface
  38.      */
  39.     protected $db;
  40.     /**
  41.      * @param DocumentRenderer $documentRenderer
  42.      * @param ConnectionInterface $db
  43.      * @param bool $renderErrorPage
  44.      */
  45.     public function __construct(DocumentRenderer $documentRendererConnectionInterface $dbConfig $config$renderErrorPage true)
  46.     {
  47.         $this->documentRenderer $documentRenderer;
  48.         $this->renderErrorPage = (bool)$renderErrorPage;
  49.         $this->db $db;
  50.         $this->config $config;
  51.     }
  52.     public static function getSubscribedEvents() :array
  53.     {
  54.         return [
  55.             KernelEvents::EXCEPTION => [
  56.                 ['onKernelException'128]
  57.             ]
  58.         ];
  59.     }
  60.     public function onKernelException(ExceptionEvent $event)
  61.     {
  62.         if ($_ENV['APP_ENV'] == 'dev') return;
  63. //        $exception = $event->getThrowable();
  64. //        $exception->getStatusCode();
  65. //        // handle ResponseException (can be used from any context)
  66. //        if ($exception instanceof ResponseException) {
  67. //            $event->setResponse($exception->getResponse());
  68. //
  69. //            // a response was explicitely set -> do not continue to error page
  70. //            return;
  71. //        }
  72.         // further checks are only valid for default context
  73.         $request $event->getRequest();
  74.         if ($this->matchesPimcoreContext($requestPimcoreContextResolver::CONTEXT_DEFAULT)) {
  75.             if ($this->renderErrorPage) {
  76.                 $this->handleErrorPage($event);
  77.             }
  78.         }
  79.     }
  80.     protected function handleErrorPage(ExceptionEvent $event)
  81.     {
  82.         //TODO: uncomment me for production
  83. //        if (\Pimcore::inDebugMode()) {
  84. //            return;
  85. //        }
  86.         $exception $event->getThrowable();
  87.         if (is_callable([$exception'getStatusCode'])) {
  88.             $statusCode 404;
  89.             $uri $_SERVER['REQUEST_URI'];
  90.             if (strstr($uri'/en/')) {
  91.                 $errorPath '/en/404';
  92.             } else if (strstr($uri'/hr/')) {
  93.                 $errorPath '/hr/404';
  94.             } else {
  95.                 $errorPath $this->config['documents']['error_pages']['default'];
  96.             }
  97.         } else {
  98.             $statusCode 500;
  99.             $uri $_SERVER['REQUEST_URI'];
  100.             if (strstr($uri'/en/')) {
  101.                 $errorPath '/en/500';
  102.             } else if (strstr($uri'/hr/')) {
  103.                 $errorPath '/hr/500';
  104.             } else {
  105.                 $errorPath '/en/500';
  106.             }
  107.         }
  108. //
  109. //        $statusCode = 500;
  110. //        $headers = [];
  111. //        if ($exception instanceof HttpExceptionInterface) {
  112. //            $statusCode = $exception->getStatusCode();
  113. //            $headers = $exception->getHeaders();
  114. //        } else {
  115. //            // only log exception if it's not intentional (like a NotFoundHttpException)
  116. //            $this->logger->error($exception);
  117. //        }
  118. //        $errorPath = $this->config['documents']['error_pages']['default'];
  119. //
  120. //        if (Site::isSiteRequest()) {
  121. //            $site = Site::getCurrentSite();
  122. //            $errorPath = $site->getErrorDocument();
  123. //        }
  124. //
  125. //        $this->logToHttpErrorLog($event->getRequest(), $statusCode);
  126. //
  127. //        // Error page rendering
  128. //        if (empty($errorPath)) {
  129. //            $errorPath = '/';
  130. //        }
  131.         $document Document::getByPath($errorPath);
  132. //        echo $document->getId();
  133. //        if (!$document instanceof Document\Page) {
  134. //            // default is home
  135. //            $document = Document::getById(1);
  136. //        } else {
  137. //            $document = $this->getDocumentVersion($document);
  138. //        }
  139.         try {
  140.             $response $this->documentRenderer->render($document, [
  141.                 'exception' => $exception,
  142.                 PimcoreContextListener::ATTRIBUTE_PIMCORE_CONTEXT_FORCE_RESOLVING => true,
  143.             ]);
  144.             //echo "suces";
  145.         } catch (\Exception $e) {
  146.             // we are even not able to render the error page, so we send the client a unicorn
  147.             $response 'Page not found. ðŸ¦„';
  148.             $this->logger->emergency('Unable to render error page, exception thrown');
  149.             $this->logger->emergency($e);
  150.         }
  151.         $event->setResponse(new Response($response$statusCode, []));
  152.     }
  153.     protected function logToHttpErrorLog(Request $request$statusCode)
  154.     {
  155.         $uri $request->getUri();
  156.         $exists $this->db->fetchOne('SELECT date FROM http_error_log WHERE uri = ?'$uri);
  157.         if ($exists) {
  158.             $this->db->query('UPDATE http_error_log SET `count` = `count` + 1, date = ? WHERE uri = ?', [time(), $uri]);
  159.         } else {
  160.             $this->db->insert('http_error_log', [
  161.                 'uri' => $uri,
  162.                 'code' => (int) $statusCode,
  163.                 'parametersGet' => serialize($_GET),
  164.                 'parametersPost' => serialize($_POST),
  165.                 'cookies' => serialize($_COOKIE),
  166.                 'serverVars' => serialize($_SERVER),
  167.                 'date' => time(),
  168.                 'count' => 1,
  169.             ]);
  170.         }
  171.     }
  172. }