<?php
namespace App\CmsBundle\Controller;
use App\CmsBundle\Enum\RobotsValue;
use App\CmsBundle\Service\MenuService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController as SymfonyAbstractController;
use Symfony\Component\ErrorHandler\Exception\FlattenException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
use App\CmsBundle\Service\OptionResolverService;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class ErrorController extends SymfonyAbstractController
{
protected const TEMPLATE = '/exception/error.html.twig';
public function __construct(
protected readonly OptionResolverService $optionResolver,
protected readonly MenuService $menuService,
protected readonly TokenStorageInterface $tokenStorage
) {}
public function index(
Request $request,
FlattenException $exception,
DebugLoggerInterface $logger = null
) {
$site = $this->optionResolver->getSite();
$isNotFound = ($exception->getStatusCode() == 404);
$robots = $isNotFound
? RobotsValue::NOINDEX_FOLLOW
: RobotsValue::INDEX_FOLLOW;
$parameters = [
'menu' => $this->menuService->getMenu(),
'site' => $site,
'template' => $site->getTemplate(),
'exception' => $exception,
'clientLocation' => null,
'seo' => ['robots' => $robots],
'is_404_page' => $isNotFound,
'parameters' => [
'user' => $this->tokenStorage->getToken()?->getUser()
]
];
if ($this->optionResolver->getSite()->getTemplate() === 'midori') {
$path = $this->optionResolver->getProjectDir()
. 'templates/'
. $this->optionResolver->getSite()->getTemplate()
. '/exception/style.css';
if (file_exists($path)) {
$cssContent = file_get_contents($path);
$response = new Response(
$this->render(
$this->optionResolver->getSite()->getTemplate() . static::TEMPLATE,
$parameters
)->getContent(),
$exception->getStatusCode()
);
$response->headers->set('Content-Type', 'text/html');
$response->setContent(str_replace('</head>', "<style>$cssContent</style></head>", $response->getContent()));
return $response;
}
}
return new Response(
$this->render(
$this->optionResolver->getSite()->getTemplate() . static::TEMPLATE,
$parameters,
)->getContent(),
$exception->getStatusCode()
);
}
}