2012-07-15 14 views
10

Nie jestem pewien, dlaczego nie łapię wyjątków od Swiftmailer w moim kontrolerze. Co robię źle, czy nie?Catch wyjątek swiftmailer w kontrolerze Symfony2 dev env

W kontrolerze mam:

try { 
    $this->get('mailer')->send($email); 
} 
catch (\Swift_TransportException $e) { 
    $result = array(
     false, 
     'There was a problem sending email: ' . $e->getMessage() 
    ); 
} 

Wydaje złapany przez Symfony zanim dotrze do mojego kodu, więc zamiast być w stanie obsłużyć błąd ja dostaję standardowy 500 strony z Swift_TransportException: Connection could not be established

Jeśli nie można wysłać wiadomości e-mail, nie ma potrzeby zatrzymywania aplikacji, ponieważ wiadomość e-mail nie jest krytyczna - chcę tylko wydać powiadomienie.

Może istnieje sposób na wyłączenie Symfony wychwytujących określone wyjątki lub niektórych kontrolerów?

+0

Myślę, że możesz być w stanie to zrobić, zastępując obsługę wyjątku Twig. Nie jestem jednak w 100% pewny. Zobacz moją odpowiedź poniżej. – codecowboy

Odpowiedz

3

Po wykonaniu $this->container->get("mailer")->send($email); wiadomość e-mail nie jest wysyłana w tym momencie, jeśli buforowanie jest włączone. Patrz http://symfony.com/doc/current/cookbook/email/spool.html

Jeśli masz domyślne ustawienie , \Swift_TransportException zostanie wygenerowany podczas fazy zakończenia jądra, po wyjściu kontrolera. Jednym ze sposobów obejścia tego problemu jest wyłączenie buforowania (ale wtedy użytkownicy mogą czekać na wysłanie wiadomości e-mail) lub można utworzyć własną listę zdarzeń, aby obsłużyć wyjątek. http://symfony.com/doc/current/cookbook/service_container/event_listener.html

0

Można spróbować nadrzędnymi wyjątkiem Handler gałązka w config.yml:

twig: 
    debug:   %kernel.debug% 
    strict_variables: %kernel.debug% 
    exception_controller: MyBundleName:Exception:show 

Następnie utworzyć klasę, która rozciąga Exception:

Symfony \ Bundle \ TwigBundle \ Controller \ ExceptionController

Zapoznaj się z kodem źródłowym tego pliku, a następnie nadpisz metody, aby zmienić, który szablon jest renderowany, gdy typem wyjątku jest Swift_TransportException

Można to zrobić poprzez ustawienie zmiennej klasy w showAction() i przekazanie go do findTemplate()

showAction:

$ this-> exceptionClassName = $ exception-> getClass();

findTemplate:

if (!$debug && $this->exceptionClassName == 'MyBundle\Exception\GenericNotFoundException') { 

      return 'BundleName:Exception:generic404.html.twig'; 
     } 

Aby uzyskać więcej informacji, polecam KNPUniversity Symfony Nagrywanie obrazu.

Powiązane problemy