2012-07-15 14 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() 
    ); 
} 

私のコードに到達する前にsymfonyによって捕まるように思われるので、代わりにエラーを処理することができるという私自身は、私が Swift_TransportException: Connection could not be establishedで標準500ページを取得します

電子メールを送信できない場合は、電子メールが重要ではないため、アプリケーションを停止する必要はありません。通知を出したいだけです。

Symfonysで特定の例外や特定のコントローラのキャッチを無効にする方法がありますか?

+0

私はあなたがTwig例外ハンドラをオーバーライドすることでそれを行うことができると思います。私は100%確信していません。下の私の答えを見てください。 – codecowboy

答えて

3

$this->container->get("mailer")->send($email);を実行すると、スプーリングがオンになっているとその時点でメールが送信されていません。 http://symfony.com/doc/current/cookbook/email/spool.html

デフォルト設定がspool: { type: memory }の場合、コントローラの終了後、カーネル終了フェーズで\Swift_TransportExceptionがスローされます。 これを回避する方法の1つは、スプーリングをオフにすることです(ただし、電子メールの送信中にユーザーが待たなければならない場合があります)。または、例外を処理する独自のeventlistenerを作成できます。 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 

あなたが、その後拡張する例外クラスを作成:

のSymfony \バンドル\ TwigBundle \コントローラ\ ExceptionController

をそのファイルのソースコードを読み込んで、例外タイプがSwift_TransportExceptionのときにどのテンプレートがレンダリングされるかを切り替えるメソッドをオーバーライドします。

あなたshowActionでクラス変数を設定することによって、それを行うことができます()とfindTemplateに渡す()

showAction:

ます$ this-> exceptionClassName = $ exception->はgetClass();

findTemplate:詳細については

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

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

、私はKNPUniversity symfonyのスクリーンキャストをお勧めします。

関連する問題