Пользовательский контроллер исключений в Symfony 4

#php #symfony #exception #symfony4 #php-7.2

#php #symfony #исключение #symfony4 #php-7.2

Вопрос:

Я создаю пользовательский контроллер исключений в Symfony 4, чтобы перезаписать ExceptionController класс, включенный в пакет Twig.

Я делаю это в соответствии с документацией Symfony для настройки страниц ошибок.

 # config/packages/twig.yaml
twig:
    exception_controller: AppControllerError::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 AppController;

use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentDebugExceptionFlattenException;

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));
    }
} 
  

Ответ №1:

На странице документации, на которую вы ссылаетесь, в самом начале главы, где переопределяется шаблон по умолчанию, документация фактически дает перекрестную ссылку на класс SymfonyBundleTwigBundleControllerExceptionController , и здесь показано, как ее использовать.

Итак, согласно собственному ExceptionController Symfony, FlattenException фактически является аргументом действия showAction :

 <?php

namespace AppController;

use SymfonyComponentDebugExceptionFlattenException;
use SymfonyComponentHttpFoundationRequest;    
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentHttpKernelLogDebugLoggerInterface;

class Error extends BaseController {

    protected $debug; // this is passed as a parameter from services.yaml
    protected $code;  // 404, 500, etc.
    protected $data;

    public function __construct(BaseController $base, bool $debug) {

        $this->debug = $debug;

        $this->data = $base->data;

    }

    public function showAction(Request $request, FlattenException $exception, DebugLoggerInterface $logger = null) {
        // dd($exception); // uncomment me to see the exception

        $template = 'error' . $exception-> getStatusCode() . '.html.twig';
        return new Response($this->renderView($template, $this->data));
    }
} 
  

Комментарии:

1.Мне нужно было также use Request amp; DebugLoggerInterface , но это сработало. Спасибо!

2. о, да, моя ошибка, забыл перепроверить ваши инструкции use и ExceptionController , спасибо, что указали. Исправлено в ответе