10

コントローラーで Swiftmailer からの例外をキャッチしない理由がわかりません。私は何が間違っているか、または欠けていますか?

私が持っているコントローラでは:

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

私のコードに到達する前に Symfony によってキャッチされるようです。そのため、自分でエラーを処理する代わりに、標準の 500 ページを取得します。 Swift_TransportException: Connection could not be established

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

Symfony が特定の例外または特定のコントローラーをキャッチするのを無効にする方法があるのではないでしょうか?

4

2 に答える 2

3

$this->container->get("mailer")->send($email);スプールがオンになっている場合、その時点で電子メール メッセージは送信されません。http://symfony.com/doc/current/cookbook/email/spool.htmlを参照してください

のデフォルト設定がある場合spool: { type: memory }\Swift_TransportExceptionコントローラーが終了した後、カーネル終了フェーズ中に がスローされます。これを回避する 1 つの方法は、スプーリングをオフにすることです (ただし、ユーザーは電子メールが送信されるまで待たなければならない場合があります)。または、独自のイベントリスナーを作成して例外を処理することもできます。http://symfony.com/doc/current/cookbook/service_container/event_listener.html

于 2014-10-11T22:01:31.950 に答える
0

config.yml で Twig Exception Handler をオーバーライドしてみてください。

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

次に、以下を拡張する Exception クラスを作成します。

Symfony\Bundle\TwigBundle\Controller\ExceptionController

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

これを行うには、showAction() でクラス変数を設定し、それを findTemplate() に渡します。

showAction:

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

テンプレートの検索:

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

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

詳細については、KNPUniversity Symfony Screencasts をお勧めします。

于 2012-08-16T16:53:31.753 に答える