src/EventListener/ErrorListener.php line 28

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Repository\Tools\AppSettingsRepository;
  4. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  5. use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Twig\Environment;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use App\Services\LogService;
  10. class ErrorListener
  11. {
  12.     private $twig;
  13.     private $appRep;
  14.     private $logService;
  15.     private $entityManager;
  16.     public function __construct(EntityManagerInterface $entityManagerEnvironment $twigAppSettingsRepository $appRepLogService $logService)
  17.     {
  18.         $this->entityManager $entityManager;
  19.         $this->twig $twig;
  20.         $this->appRep $appRep;
  21.         $this->logService $logService;
  22.     }
  23.     public function onKernelException(ExceptionEvent $event)
  24.     {
  25.         $exception $event->getThrowable();
  26. //        dd($exception);
  27.         $statusCode $exception instanceof HttpExceptionInterface $exception->getStatusCode() : 500;
  28.         $this->_getAppSettings($this->appRep);
  29.         $errorData = [
  30.             'app_settings' => $this->appSettings,
  31.             'is_error' => true,
  32.             'msg_1' => sprintf('Błąd %d'$statusCode),
  33.             'msg_2' => $this->getErrorMessage($statusCode),
  34.             'msg_3' => '',
  35.             'link' => '',
  36.             'link_name' => '',
  37.             'link_msg' => '',
  38.         ];
  39.         if ($statusCode == 500) {
  40.                 $logMessage sprintf(
  41.                     '%s w pliku %s w linii %d trace: %s',
  42.                     $exception->getMessage(),
  43.                     $exception->getFile(),
  44.                     $exception->getLine(),
  45.                     $this->getStackTrace()
  46.                 );
  47.                 $this->logService->createSystemLog($logMessage);
  48.         }
  49.         $response = new Response($this->twig->render('error.html.twig'$errorData));
  50.         $event->setResponse($response);
  51.     }
  52.     private function _getAppSettings($appRepository)
  53.     {
  54.         $this->appSettings $appRepository->getAppSettings();
  55.     }
  56.     private function getStackTrace()
  57.     {
  58.         $stackTrace = [];
  59.         $trace debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT5);
  60.         foreach ($trace as $frame) {
  61.             if (isset($frame['file']) && isset($frame['line'])) {
  62.                 $stackTrace[] = sprintf('%s:%d'$frame['file'], $frame['line']);
  63.             }
  64.         }
  65.         return implode("\n"$stackTrace);
  66.     }
  67.     private function getErrorMessage($statusCode)
  68.     {
  69.         switch ($statusCode) {
  70.             case 403:
  71.                 return 'Brak dostępu!';
  72.             case 404:
  73.                 return 'Nie znaleziono strony!';
  74.             case 500:
  75.                 return 'Wystąpił błąd serwera!';
  76.             default:
  77.                 return 'Wystąpił błąd serwera!';
  78.         }
  79.     }
  80.     private function handleTransaction(callable $callback)
  81.     {
  82.         try {
  83.             $this->entityManager->beginTransaction();
  84.             $callback();
  85.             $this->entityManager->commit();
  86.         } catch (\Exception $e) {
  87.             $this->entityManager->rollback();
  88.         }
  89.     }
  90. }