<?php
namespace Social\InternalBundle\Service;
use Sentry\ClientInterface;
use Social\FrontendBundle\Service\ThemeManager;
use Symfony\Bundle\TwigBundle\TwigEngine;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
/**
* Class ExceptionListener
*
* @package Social\InternalBundle\Service
*/
class ExceptionListener
{
/**
* @var ThemeManager $themeManager
*/
protected $themeManager;
/**
* @var RequestStack
*/
protected $currentRequest;
/**
* @var TwigEngine $templating
*/
protected $templating;
/**
* @var null|string
*/
protected $projectDir = null;
/**
* @var ClientInterface
*/
private $sentry;
/**
* ExceptionListener constructor.
*
* @param ThemeManager $manager
* @param RequestStack $request
* @param TwigEngine $twigEngine
* @param $projectDir
*/
public function __construct(
ThemeManager $manager,
RequestStack $request,
TwigEngine $twigEngine,
$projectDir,
ClientInterface $sentry
) {
$this->themeManager = $manager;
$this->currentRequest = $request;
$this->templating = $twigEngine;
$this->projectDir = $projectDir;
$this->sentry = $sentry;
}
/**
* @param GetResponseForExceptionEvent $event
*/
public function onException(GetResponseForExceptionEvent $event)
{
try {
// Getting the status code
$statusCodeException = null;
if ($event->getException() instanceof \Exception) {
if (method_exists($event->getException(), 'getStatusCode')) {
$statusCodeException = $event->getException()->getStatusCode();
}
if (method_exists($event->getException(), 'getCode')) {
$statusCodeException = $event->getException()->getCode();
}
$this->sentry->captureException($event->getException());
}
$defaultErrorPage = 'error.html.twig';
$defaultNotFoundPage = 'error404.html.twig';
$pathToErrorFiles = 'Resources/TwigBundle/views/Exception/';
$themeSettings = $this->themeManager->getActiveTheme();
$siteName = strtolower($themeSettings['site_name']);
$logo = $themeSettings['logo'];
$currentThemeName = $themeSettings['name'] ? $themeSettings['name'] : null;
// 404 / 403 page
if (in_array($statusCodeException, [404, 403])) {
if (file_exists($this->projectDir . DIRECTORY_SEPARATOR . $pathToErrorFiles . 'error404_' . $currentThemeName . '.html.twig')) {
$response = $this->templating->render($this->projectDir . DIRECTORY_SEPARATOR . $pathToErrorFiles . 'error404_' . $currentThemeName . '.html.twig',
[
'siteName' => strtolower(trim($siteName)),
'logo' => strtolower(trim($logo)),
]);
$event->setResponse(new Response($response, 404));
} else {
$response = $this->templating->render($this->projectDir . DIRECTORY_SEPARATOR . $pathToErrorFiles . $defaultNotFoundPage,
[
'siteName' => strtolower(trim($siteName)),
'logo' => strtolower(trim($logo)),
]);
$event->setResponse(new Response($response, 404));
}
} else {
if (file_exists($this->projectDir . DIRECTORY_SEPARATOR . $pathToErrorFiles . 'error_' . $currentThemeName . '.html.twig')) {
$response = $this->templating->render($this->projectDir . DIRECTORY_SEPARATOR . $pathToErrorFiles . 'error404_' . $currentThemeName . '.html.twig',
[
'siteName' => strtolower(trim($siteName)),
'logo' => strtolower(trim($logo)),
]);
$event->setResponse(new Response($response, 404));
} else {
$response = $this->templating->render($this->projectDir . DIRECTORY_SEPARATOR . $pathToErrorFiles . $defaultErrorPage,
[
'siteName' => strtolower(trim($siteName)),
'logo' => strtolower(trim($logo)),
]);
$event->setResponse(new Response($response, 404));
}
}
} catch (\Exception $exception) {
$this->sentry->captureException($exception);
}
}
}