<?php
namespace App\Controller;
use App\Tools\LocaleHelper;
use Symfony\Bundle\TwigBundle\Controller\ExceptionController as TwigExceptionController;
use Symfony\Component\Debug\Exception\FlattenException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
use Twig\Environment as Twig;
class ExceptionController extends TwigExceptionController
{
/**
* @var LocaleHelper
*/
private $localeHelper;
/**
* @param Twig $twig
* @param bool $debug Show error (false) or exception (true) pages by default
* @param LocaleHelper $localeHelper
*/
public function __construct(Twig $twig, bool $debug=true, LocaleHelper $localeHelper)
{
parent::__construct($twig, $debug);
$this->localeHelper = $localeHelper;
}
/**
* @param Request $request
* @param FlattenException $exception
* @param DebugLoggerInterface|null $logger
*
* @return Response
* @throws
* @todo Theme
*/
public function showAction(Request $request, FlattenException $exception, ?DebugLoggerInterface $logger = null)
{
$currentContent = $this->getAndCleanOutputBuffering($request->headers->get('X-Php-Ob-Level', -1));
$showException = $request->attributes->get('showException', $this->debug); // As opposed to an additional parameter, this maintains BC
$code = $exception->getStatusCode();
$route = $request->get('_route');
if ($showException || $route === 'api_synchronize') {
return parent::showAction($request, $exception);
}
$locale = $this->localeHelper->guessLocaleFromUri($request->getRequestUri());
if (!empty($locale)) {
$request->setLocale($locale);
}
$template = 'bundles/TwigBundle/Exception/error.html.twig';
if ($code === 404) {
$template = 'bundles/TwigBundle/Exception/error404.html.twig';
}
return new Response($this->twig->render(
$template,
array(
'status_code' => $code,
'status_text' => isset(Response::$statusTexts[$code]) ? Response::$statusTexts[$code] : '',
'exception' => $exception,
'logger' => $logger,
'currentContent' => $currentContent
)
), 200, array('Content-Type' => $request->getMimeType($request->getRequestFormat()) ?: 'text/html'));
}
}