Исключение исключения swiftmailer в Symfony2 dev env controller

Я не уверен, почему я не поймаю исключения из 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 определенных исключений или для определенных контроллеров?

Ответ 1

Когда вы выполняете $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

Ответ 2

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

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();

findTemplate:

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

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

Для получения дополнительной информации я рекомендую KNPUniversity Symfony Screencasts.