2013-08-13 14 views
8

Pracuję nad prostą aplikacją pocztową z kontem Gmail jako hostem. Działa jak urok, ale problem rośnie, gdy funkcja send() rzuca wyjątek. Widzę, że instrukcja catch catch nie może obsłużyć wyjątku. Nie działa, nawet jeśli używam klasy wyjątków Global. to pytanie omówione gdzieś również.Wyjątek Swiftmailer nie łapie w kontrolerze Symfony2

na przykład:

Catch swiftmailer exception in Symfony2 dev env controller

lub

https://groups.google.com/forum/#!topic/symfony2/SlEzg_PKwJw

ale nie osiągnęła odpowiedzi roboczą.

Mój kod funkcji kontroler jest:

public function ajaxRegisterPublisherAction() 
    { 

//some irrelevant logic 

    $returns= json_encode(array("username"=>$username,"responseCode"=>$responseCode)); 


    try{ 
      $message = \Swift_Message::newInstance() 
     ->setSubject('hello world') 
     ->setFrom('[email protected]') 
     ->setTo('[email protected]') 
     ->setBody(
      $this->renderView('AcmeSinamelkBundle:Default:email.txt.twig',array('name'=>$username,"password"=>$password)) 
     ); 
     $this->container->get("mailer")->send($message); 

    } 
    catch (Exception $e) 
    { 

    } 



    return new \Symfony\Component\HttpFoundation\Response($returns,200,array('Content-Type'=>'application/json')); 


    } 

Odpowiedź który wysłał z góry kodu, który otrzyma w konsoli Firebug:

{"username":"xzdvxvvcvxcv","responseCode":200}<!DOCTYPE html> 
<html> 
    . 
    . 
Swift_TransportException: Connection could not be established with host smtp.gmail.com [Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP?] 
    . 
    . 
</html> 

i złapię moje włosy, bo nie wiem dlaczego jądro obsługuje wyjątek w dalszym ciągu mojego obiektu JSON?

kiedy skomentować tę linię.

$this->container->get("mailer")->send($message); 

wyjątek nie występuje i mam ważny json w stronie klienta (czyli sprawa-of-chociaż oczywiście) Zmieniłem Exception do \Exception lub \Swift_TransportException lub nawet Swift_TransportException! ale nie ma dobrego wyniku.

+0

Czy próbowałeś 'Swift_SwiftException'? W pliku znajduje się "Klasa wyjątków bazowych". – ferdynator

+0

Mam na myśli "wyjątek" według "klasy wyjątków Base" – CoderInNetwork

+0

Testowałem teraz z "Swift_SwiftException" i "\ Swift_SwiftException". Czy to nie działa – CoderInNetwork

Odpowiedz

1

trzeba pokonać dyspozytora zdarzeń przed odesłać wyjątek, więc słuchają tego rodzaju imprez i wyciszyć je, choć myślę, że to jest zły sposób na radzenie sobie z nim

class SuchABadRequest implements \Swift_Events_TransportExceptionListener{ 

    /** 
    * Invoked as a TransportException is thrown in the Transport system. 
    * 
    * @param \Swift_Events_TransportExceptionEvent $evt 
    */ 
    public function exceptionThrown(\Swift_Events_TransportExceptionEvent $evt) 
    { 

     $evt->cancelBubble(); 

     try{ 
      throw $evt->getException(); 
     }catch(\Swift_TransportException $e){ 
      print_r($e->getMessage()); 
     } 
    } 
} 

Wewnątrz kontroler

$mailer = $this->get('mailer'); 

$mailer->registerPlugin(new SuchABadRequest()); 
3

Kiedy robisz $this->container->get("mailer")->send($message); wiadomość e-mail nie jest wysyłana w tym momencie, jeśli masz włączone buforowanie. 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

ten problem należy do tak wiele razy temu. W finale nie udało nam się rozwiązać problemu i dlatego wykorzystaliśmy inną bibliotekę pocztową.niestety nie wiem, czy twoje rozwiązanie działa, czy nie teraz – CoderInNetwork

Powiązane problemy