Symfony2异常事件侦听器运行一些控制器操作

时间:2013-04-13 08:15:03

标签: symfony

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

所有这些都是在作为异常事件监听器(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]));

1 个答案:

答案 0 :(得分:1)

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

(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);