Поймать исключение 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.