2012-04-26 30 views
6

Odpowiednio do tej strony doc:Zastępowanie wyjątków Symfony 2?

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

Symfony używa TwigBundle do sterowania wyświetlaniem wyjątkami. Jednak nie zamierzam dostosowywać wyświetlacza, jak wspomniano w dokumencie, zamierzam to zmienić. Pracuję nad małym interfejsem API REST i chciałem zastąpić wywołanie TwigBundle moim pakietem, czyniąc obsługę własnych wyjątków (w kategoriach REST: mapuj poprawne kody stanu HTTP i odpowiedzi tekstowe w postaci zwykłego tekstu).

Nie mogłem nic na ten temat znaleźć, a odniesienie do instrukcji nie jest takie dobre, szczególnie w części dotyczącej jądra. Może ktoś już to zrobił i może mi pomóc? Dzięki.

Odpowiedz

11

Należy utworzyć słuchacza, który nasłuchuje na kernel.exception wydarzenie. W metodzie tej onKernelException słuchacza można sprawdzić za wyjątkiem np

Na wyjątku klasy słuchacza

//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. 
     } 
     } 
    } 

Deklaracja usługa byłaby

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

Czy mogę umieścić odbiornik w katalogu głównym mojego pakietu? – vinnylinux

+0

Nie działa, ale nie zastępuje wyjątków. – vinnylinux

+0

Na stronie profilowania narzędzia program narzędziowego dev. Wybierz zakładkę wydarzeń po lewej stronie. Zobaczysz listę słuchaczy. Sprawdź, czy twój słuchacz tam jest. –

1

Bellow jest częścią mojego AppKernel.php na wyłączenie wewnętrznego catch Exception przez Symfony żądań JSON, (można zastąpić handle metodę zamiast tworzyć drugi)

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

To wydaje się być nieco ... każdy hackish inny sposób? – vinnylinux

+0

Rozszerzanie klasy o konformację OOP jest hackowskie? – sbczk

+0

Nie wiesz, co masz na myśli przez "konwencję OOP". Dobrym pomysłem jest nie zastępować klas szkieletowych. KernelEvents :: EXCEPTION jest wyrzucany na samym początku handleResponse, więc możesz go tam podłączyć, nasłuchując go w swoim własnym detektorze zamiast modyfikować klasy framework. – smentek