Я создаю собственный контроллер исключений в Symfony 4, чтобы перезаписать класс ExceptionController
, включенный в комплект Twig.
Я делаю это в соответствии с документацией Symfony для настройки страниц ошибок .
# config/packages/twig.yaml
twig:
exception_controller: App\Controller\Error::handleException
Причина, по которой я использую пользовательский контроллер исключений, заключается в том, что мне нужно передать в шаблон некоторую дополнительную переменную, заданную пользовательским BaseController
классом.
В документации Symfony говорится об использовании пользовательского контроллера:
Класс ExceptionListener, используемый TwigBundle в качестве прослушивателя события kernel.exception, создает запрос, который будет отправлен вашему контроллеру. Кроме того, вашему контроллеру будут переданы два параметра:
exception
A FlattenException instance created from the exception being handled.
logger
A DebugLoggerInterface instance which may be null in some circumstances.
Мне нужен сервис FlattenException
для определения кода ошибки, но из документов не ясно, как эти параметры передаются в контроллер пользовательских исключений.
Вот мой код контроллера пользовательских исключений:
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Debug\Exception\FlattenException;
class Error extends BaseController {
protected $debug, // this is passed as a parameter from services.yaml
$code; // 404, 500, etc.
public function __construct(BaseController $Base, bool $debug) {
$this->debug = $debug;
$this->data = $Base->data;
// I'm instantiating this class explicitly here, but have tried autowiring and other variations that all give an error.
$exception = new FlattenException();
$this->code = $exception->getStatusCode(); // empty
}
public function handleException(){
$template = 'error' . $this->code . '.html.twig';
return new Response($this->renderView($template, $this->data));
}
}