Symfony 2.7 обработчик пользовательских исключений - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь использовать пользовательский контроллер для обработки исключений в моем проекте Symfony 2.7, но я получаю эту ошибку: Type error: Too few arguments to function Symfony\Bundle\TwigBundle\Controller\ExceptionController::__construct()

Я установил класс исключения следующим образом:

twig:
    exception_controller: MyProject\MainBundle\Controller\MyProjectExceptionController::showException 

Я знаю, что должен настроить службу для передачи правильных аргументов в конструктор.Итак, у меня есть следующая конфигурация в config.yml:

services:
    myproject.twig.controller.exception: 
        class: MyProject\MainBundle\Controller\MyProjectExceptionController 
        arguments: [@twig, %kernel.debug%]

Я прочитал ответы многих SO на эту тему и увидел, что между версиями Symfony есть некоторые изменения в этой конфигурации.Я также пробовал app.configuration_exception и некоторые другие варианты.

Кто-нибудь знает, какова правильная конфигурация специально для Symfony 2.7?

Редактировать

Ответ @Constantin:

На самом деле я все еще проводил начальные тесты.Поэтому я в основном скопировал ExceptionControler от Twig и удалил все, кроме showAction, и включил переменную тестовой среды, чтобы проверить, все ли работает нормально.Это результат:

<?php

namespace MyProject\MainBundle\Controller;

use Symfony\Bundle\TwigBundle\Controller\ExceptionController;

use Symfony\Component\HttpKernel\Exception\FlattenException;
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
//use Symfony\Bundle\FrameworkBundle\Templating\TemplateReference;
//use Symfony\Component\Templating\TemplateReferenceInterface;
//use Twig\Environment;
//use Twig\Error\LoaderError;
//use Twig\Loader\ExistsLoaderInterface;

class MyProjectExceptionController extends ExceptionController {

    public function showAction(Request $request, FlattenException $exception, DebugLoggerInterface $logger = null)
    {
        $currentContent = $this->getAndCleanOutputBuffering($request->headers->get('X-Php-Ob-Level', -1));
        $showException = $request->attributes->get('showException', $this->debug); // As opposed to an additional parameter, this maintains BC

        $code = $exception->getStatusCode();

        return new Response($this->twig->render(
            (string) $this->findTemplate($request, $request->getRequestFormat(), $code, $showException),
            array(
                'status_code' => $code,
                'status_text' => isset(Response::$statusTexts[$code]) ? Response::$statusTexts[$code] : '',
                'exception' => $exception,
                'logger' => $logger,
                'currentContent' => $currentContent,
                'test' => "TEST"
            )
            ), 200, array('Content-Type' => $request->getMimeType($request->getRequestFormat()) ?: 'text/html'));
    }
}

1 Ответ

0 голосов
/ 19 декабря 2018

Я вижу, что у вас есть небольшая ошибка в

twig:
    exception_controller: MyProject\MainBundle\Controller\MyProjectExceptionController::showException

Эта строка должна быть "showAction", а не "showException".Но я не могу подтвердить, что это решит проблему.

Поскольку вы расширяете "ExceptionController", определение службы должно быть в порядке и соответствовать конструктору.Но лучше поместить определения сервисов в services.yml

Можете ли вы запустить эту команду и попытаться найти в ней свой сервис (чтобы убедиться, что он там есть):

php app/console debug:container

[EDIT] Хорошо, просто прочитайте документ, и мы можем прочитать:

В случае расширения ExceptionController вы можете сконфигурировать сервис для передачи среды Twig и флага отладки конструктору.*** А затем настройте twig.exception_controller, используя контроллер в качестве синтаксиса служб (например, app.exception_controller: showAction).

В вашем случае это даст:

twig:
    exception_controller: myproject.twig.controller.exception:showAction

Iдумаю, это должно решить вашу проблему ... Пожалуйста, попробуйте и дайте мне знать результат.

PS: документ доступен здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...