我试图在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'));
}
}
答案 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