2013-04-13 64 views
1

我需要做兩件事之一(按優先順序,但只需要其中之一)。Symfony2異常事件偵聽器運行一些控制器動作

所有這些都是在作爲Exception Event Listener(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

查看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);