2012-04-26 13 views
6

En consecuencia a esta página doc:Anulando excepciones de Symfony 2?

http://symfony.com/doc/current/cookbook/controller/error_pages.html

Symfony utiliza el TwigBundle para controlar la visualización de las excepciones. Sin embargo, no estoy buscando personalizar la pantalla, como se menciona en el documento, estoy buscando anular esto. Estoy trabajando en una pequeña API REST y quería anular la llamada de TwigBundle a mi paquete, haciendo mi propio manejo de excepciones (en términos de REST: asignar códigos de estado HTTP correctos y respuestas corporales de texto sin formato).

No pude encontrar nada al respecto y la referencia en el manual no es tan buena, especialmente en la parte del kernel. ¿Tal vez alguien ya hizo esto y puede ayudarme? Gracias.

Respuesta

11

Debe crear un oyente que escucha en el kernel.exception evento. En onKernelException método de esa escucha que se puede comprobar por ejemplo, para su excepción

En la clase escucha de excepciones

//namespace declarations 
    class YourExceptionListener 
    { 

     public function onKernelException(GetResponseForExceptionEvent $event) 
     { 
     $exception = $event->getException(); 
     if ($exception instanceof YourException) { 
      //create response, set status code etc. 
      $event->setResponse($response); //event will stop propagating here. Will not call other listeners. 
     } 
     } 
    } 

La declaración de servicio sería

//services.yml 
kernel.listener.yourlisener: 
    class: FQCN\Of\YourExceptionListener 
    tags: 
    - { name: kernel.event_listener, event: kernel.exception, method: onKernelException } 
+0

¿Puedo colocar el oyente en la raíz de mi paquete? – vinnylinux

+0

Aunque no funcionó, no anula las excepciones. – vinnylinux

+0

En la página de perfil de la barra de herramientas dev del modo de depuración. Seleccione la pestaña de eventos en el lado izquierdo. Verá una lista de oyentes. Verifica si tu oyente está allí. –

1

Bellow es parte de mi AppKernel.php para deshabilitar la captura de excepciones interna por Symfony para solicitudes JSON, (se puede reemplazar handle método en lugar de crear un segundo)

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpKernel\HttpKernelInterface; 
use Symfony\Component\HttpKernel\Kernel; 
use Symfony\Component\Config\Loader\LoaderInterface; 

class AppKernel extends Kernel { 
    public function init() { 
    parent::init(); 

    if ($this->debug) { 
     // workaround for nasty PHP BUG when E_STRICT errors are reported 
     error_reporting(E_ALL); 
    } 
    } 

    public function handleForJson(Request $request, 
           $type = HttpKernelInterface::MASTER_REQUEST, 
           $catch = true 
) { 
    return parent::handle($request, $type, false); 
    } 
    ... 
+1

Esto parece ser un poco hacker ... cualquier ¿Otra manera? – vinnylinux

+0

¿Extender Clase con OOP convetion es hackish? – sbczk

+0

No estoy seguro de lo que quiere decir con "convención OOP". La buena idea es no sobrescribir las clases de framework. KernelEvents :: EXCEPTION se inicia desde el principio de handleResponse, por lo que puedes conectarlo escuchándolo en tu propio oyente en lugar de modificar las clases de framework. – smentek