1

我需要做两件事中的一件(按优先顺序,但只需要其中一件)。

所有这些都将在作为异常事件侦听器 ( http://api.symfony.com/2.2/Symfony/Component/HttpKernel/Event/GetResponseForExceptionEvent.html ) 运行的函数中完成。

下面的两个在普通控制器中都很容易,但我在事件监听器函数中看不到它。

(1) 正常运行控制器并正常输出,就好像该路由已执行一样:

e.g. $event->runController('controllerName');

(2) 使用与普通控制器中相同的语法来正常渲染模板:

return $this->render('Bundle:Default:feedback.html.twig', array([template vars]));
4

1 回答 1

1

看看 symfony 中的默认异常监听器Symfony\Component\HttpKernel\EventListener\ExceptionListener

(1) 运行一个控制器可以这样实现:

    $request = new \Symfony\Component\HttpFoundation\Request();
    $request->setMethod('GET');
    [..]

    try {
        $response = $event->getKernel()->handle($request, HttpKernelInterface::SUB_REQUEST, true);
    } catch (\Exception $e) {
        return; // pass it to next exception listener this way 
    }

    $event->setResponse($response);

(2) 在异常监听器中渲染模板

您需要做的就是将模板(引擎)传递给 service.yml 中的侦听器

    services:
      foobar.exception_listener_service:
        class: %foobar.exception_listener_service.class%
        arguments:
          container: "@service_container"
        tags:
          - { name: kernel.event_listener, event: kernel.exception, method: onKernelException, priority: 255 }

在侦听器中,您可以呈现如下所列的模板

    $templating = $this->container->get('templating');
    $response = new Response($templating->render('foobar:Exception:error404.html.twig', array('exception' => $exception)));
    $event->setResponse($response);
于 2013-11-10T19:19:55.360 回答