Symfony 2.7自定义异常处理程序

时间:2018-12-17 21:35:14

标签: symfony

我试图在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%]

我已经阅读了许多关于该主题的答案,并发现Symfony版本之间的配置有所变化。我也尝试了app.configuration_exception和其他一些选项。

任何人都知道专门针对Symfony 2.7的正确配置是什么?

修改

回答@Constantin:

实际上,我仍在进行初始测试。因此,我基本上复制了Twig的ExceptionControler,并去除了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 :(得分:1)

我发现您在

中有一个小错误
twig:
    exception_controller: MyProject\MainBundle\Controller\MyProjectExceptionController::showException

该行应为“ showAction”而不是“ showException”。 但我无法确定它将解决此问题。

在扩展“ ExceptionController”时,服务的定义应该是正确的,并且将与构造函数匹配。但是最好将服务定义放入services.yml

您可以运行此命令并尝试在其中找到您的服务(以确保它在那里):

php app/console debug:container

[编辑]好,只要阅读文档,我们就可以阅读:

  

如果扩展ExceptionController,则可以配置服务以将Twig环境和调试标志传递给构造函数。 ***然后使用控制器作为服务语法配置twig.exception_controller(例如app.exception_controller:showAction)。

对于您而言,它会给出:

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

我想这应该可以解决您的问题... 请尝试让我知道结果。

PS:文档可用here