Поймать исключение 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, прежде чем он доберется до моего кода, поэтому вместо того, чтобы обрабатывать ошибку самостоятельно, я получаю стандартную страницу 500 с Swift_TransportException: Connection could not be established

Если электронная почта не может быть отправлена, нет необходимости останавливать приложение, поскольку электронная почта не критична - я просто хочу выпустить уведомление.

может быть, есть способ отключить ловлю Symfonys определенных исключений или для определенных контроллеров?

2 ответов


когда вы $this->container->get("mailer")->send($email); сообщение электронной почты не отправляется в этот момент, если у вас включена буферизация. См.http://symfony.com/doc/current/cookbook/email/spool.html

Если у вас есть значение по умолчанию spool: { type: memory } на \Swift_TransportException будет брошен во время фазы завершения ядра, после выхода вашего контроллера. Один из способов обойти это, чтобы отключить спулинг (но тогда пользователям придется ждать, пока письмо будет отправлено), или вы можете сделать свой собственный eventlistener для обработки исключения. http://symfony.com/doc/current/cookbook/service_container/event_listener.html


вы можете попробовать переопределить обработчик исключений Twig в config.в формате YML:

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

затем вы создаете класс исключений, который расширяется:

Symfony\Bundle\TwigBundle\Controller\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 Screencasts.