不能使异常控制器工作- Symfony2


Can't get Exception Controller working - Symfony2

namespace etc...
use Symfony'Bundle'FrameworkBundle'Controller'Controller;
use Symfony'Bundle'TwigBundle'Controller'ExceptionController;
use Symfony'Component'HttpFoundation'Request;
use Symfony'Component'HttpKernel'HttpKernel;
use Symfony'Component'HttpKernel'Exception'FlattenException;
use Symfony'Component'HttpKernel'Log'DebugLoggerInterface;
use Symfony'Component'HttpFoundation'Response;
class MyExceptionController extends ExceptionController
{
    public function showAction(Request $request, FlattenException $exception, DebugLoggerInterface $logger = null, $format = 'html')
    {

    }
}

在控制器内不做任何事情会返回"未捕获的异常'Symfony'Component'Routing' exception 'ResourceNotFoundException' in…"错误。不确定这是对的,还是这是另一个问题。我希望它只做通常的动作。

我只需要这样做,这样它就会显示一个指定的路由,就像我去domain.com/page一样。

我试过了:

   $httpKernel = $this->container->get('kernel');
   $response = $httpKernel->forward('AcmeMyBundle:Default:pageAction');
   $this->setResponse(new Response($response));

…但是得到这个错误:

Call to a member function get() on a non-object in...

你的代码看起来和我昨天做的很像。我想获得所有NotFoundHttpException异常,并尝试将它们转发到默认控制器。我通过一个异常监听器实现了这一点,如下所示:

<?php
namespace Acme'MyBundle'Listener;
use Symfony'Component'HttpKernel'Exception'NotFoundHttpException;
use Symfony'Component'HttpKernel'Event'GetResponseForExceptionEvent;
class NotFoundHttpExceptionListener
{
    protected $container;
    public function setContainer($container)
    {
        $this->container = $container;
    }
    public function onKernelException(GetResponseForExceptionEvent $event)
    {
        $exception = $event->getException();
        if ($exception instanceof NotFoundHttpException) {
            $httpKernel = $this->container->get('http_kernel');
            $response = $httpKernel->forward(
                'AcmeMyBundle:Controller:action',
                array(
                    'uri'  => $_SERVER['REQUEST_URI'],
                )
            );
            $response->headers->set('X-Status-Code', '200');
            $event->setResponse($response);
            $event->stopPropagation();
        }
    }
}

注意,X-Status-Code是必要的,如果你想返回另一个状态码比404,因为HttpKernel中的handleException方法将使用它来设置最终状态码,并从头部分删除它。

我的服务。Yml看起来像这样:

notfoundhttp.exception.listener:
  class: Acme'MyBundle'Listener'NotFoundHttpExceptionListener
  calls:
    - [ setContainer, [@service_container] ]
  tags:
    - { name: kernel.event_listener, event: kernel.exception, method: onKernelException }