<?php
namespace Sq\Service\Controller;
use Sq\Service\Environment;
use Symfony\Component\ErrorHandler\ErrorRenderer\ErrorRendererInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\KernelInterface;
class ErrorController extends AbstractController
{
/** @var Environment */
protected $environment;
/** @var RequestStack */
protected $requestStack;
/** @var KernelInterface */
protected $kernel;
/** @var ErrorRendererInterface */
protected $symfonyErrorRenderer;
public function __construct(Environment $environment, RequestStack $requestStack, KernelInterface $kernel, ErrorRendererInterface $symfonyErrorRenderer)
{
$this->environment = $environment;
$this->requestStack = $requestStack;
$this->kernel = $kernel;
$this->symfonyErrorRenderer = $symfonyErrorRenderer;
}
/**
* An error occured, display the output.
*
* @param \Throwable $exception
*
* @return Response
*/
public function show(\Throwable $exception)
{
$exception = $this->symfonyErrorRenderer->render($exception);
$statusCode = $exception->getStatusCode();
if ($this->environment->isProd() || !$this->environment->isDebug())
{
if ($statusCode === 404)
{
return $this->error404();
}
return $this->error500();
}
// This will render the Symfony detailed error page.
return new Response($exception->getAsString(), $exception->getStatusCode(), $exception->getHeaders());
}
/**
* Renders the 404 error page.
* Must be public as it is called from 404.php for legacy reasons.
*
* @return Response
*/
public function error404(): Response
{
$response = new Response();
$response->setStatusCode(404);
// add 404 status code to Request attributes for further handling down the line (UserTrackingService will be skipped)
$currentRequest = $this->requestStack->getCurrentRequest();
if ($currentRequest)
{
$currentRequest->attributes->set('sq_status_code', 404);
}
if ($this->getCurrentMember())
{
return $this->renderAppPage("shared/error/404.php", [], $response);
}
return $this->renderMarketingPage("shared/error/404.php", [], $response);
}
/**
* Renders the 500 error page.
* Must be public as it is called from errors.inc.php for legacy reasons.
*
* @param \Throwable|null $e
* A throwable to show details on if its in dev mode.
*
* @return Response
*/
public function error500(?\Throwable $e = null): Response
{
$response = new Response();
$response->setStatusCode(500);
if ($this->getCurrentMember())
{
return $this->renderAppPage("shared/error/500.php", ['exception' => $e], $response);
}
return $this->renderMarketingPage("shared/error/500.php", ['exception' => $e], $response);
}
}