Контроллер пользовательских исключений в Symfony 4 - PullRequest
1 голос
/ 27 марта 2019

Я создаю собственный контроллер исключений в 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));
    }
} 

1 Ответ

1 голос
/ 27 марта 2019

На странице документации, на которую вы ссылаетесь, в самом начале главы Переопределение шаблона по умолчанию Документация фактически связывает вас с классом \Symfony\Bundle\TwigBundle\Controller\ExceptionController, и это показывает вам, как его использовать.

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

<?php

namespace App\Controller;

use Symfony\Component\Debug\Exception\FlattenException;
use Symfony\Component\HttpFoundation\Request;    
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;

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