2012-07-15 2 views
10

내 컨트롤러에서 Swiftmailer의 예외를 잡아 내지 못하는 이유를 모르겠다. 내가 뭘 잘못하고 있니? 컨트롤러에서 Symfony2 dev env 컨트롤러에서 swiftmailer 예외 잡기

내가 가진 :

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

내 코드에 도달하기 전에 심포니에 의해 잡힐 것 같다, 그래서 대신 자신이 내가 Swift_TransportException: Connection could not be established와 표준 500 페이지를 얻을 오류를 처리 할 수있는의

전자 메일을 보낼 수없는 경우 전자 메일이 중요하지 않으므로 응용 프로그램을 중지 할 필요가 없습니다. 단지 알림을 보내려합니다.

Symfonys에서 특정 예외를 포착하거나 특정 컨트롤러를 포착 할 수 없게하는 방법이 있습니까?

+0

Twig Exception 핸들러를 재정 의하여 할 수 있다고 생각합니다. 나는 100 % 확실하지 않다. 아래 내 대답을 참조하십시오. – codecowboy

답변

3

$this->container->get("mailer")->send($email); 스풀링이 켜져 있으면이 시점에서 이메일 메시지가 전송되지 않습니다. http://symfony.com/doc/current/cookbook/email/spool.html

기본 설정이 spool: { type: memory } 인 경우 컨트롤러가 종료 된 후 커널 종료 단계에서 \Swift_TransportException이 발생합니다. 이 문제를 해결하는 한 가지 방법은 스풀링을 해제하는 것입니다 (이메일을 보내는 동안 사용자가 기다려야 할 수도 있음). 또는 예외를 처리하기 위해 자체 이벤트 리스너를 만들 수 있습니다. http://symfony.com/doc/current/cookbook/service_container/event_listener.html

0

당신 config.yml에서 나뭇 가지 예외 핸들러를 재정의하는 시도 할 수 있습니다 :

twig: 
    debug:   %kernel.debug% 
    strict_variables: %kernel.debug% 
    exception_controller: MyBundleName:Exception:show 
그런 다음 확장하는 예외 클래스를 만들

:

심포니 \ 번들 \ TwigBundle \ 컨트롤러 \를

ExceptionController

을 이 파일의 소스 코드를 읽고 예외 유형이 Swift_TransportException 인 경우 렌더링 할 템플릿을 전환하는 메서드를 재정의하십시오.

당신은 할 수 showAction의 클래스 변수()를 설정하고 findTemplate()

showAction에 전달하여 :

$ this-> exceptionClassName = $ 예외 중> getClass();

findTemplate :

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

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

자세한 내용은, 내가 KNPUniversity 심포니 스크린 캐스트 좋습니다.