Исключение исключения 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.