我需要做两件事之一(按优先顺序排列,但只需要其中一件)。
所有这些都是在作为异常事件监听器(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]));
答案 0 :(得分:1)
在Symfony\Component\HttpKernel\EventListener\ExceptionListener
中查看symfony的默认异常监听器。
$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);
您需要做的就是将模板(引擎)传递给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);