【问题标题】:Symfony2 exception event listener run some controller actionsSymfony2 异常事件监听器运行一些控制器动作
【发布时间】:2013-04-13 08:15:02
【问题描述】:

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

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

【问题讨论】:

    标签: symfony


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2016-02-28
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 2013-07-01
      • 2018-03-18
      • 2016-11-30
      • 1970-01-01
      • 2013-02-08
      相关资源
      最近更新 更多