我不知道为什么我没有在我的控制器中捕获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捕获某些异常或某些控制器?
答案 0 :(得分:3)
执行$this->container->get("mailer")->send($email);
时,如果您已打开假脱机,则此时不会发送电子邮件。见http://symfony.com/doc/current/cookbook/email/spool.html
如果您的默认设置为spool: { type: memory }
,则在您的控制器退出后,在内核终止阶段将抛出\Swift_TransportException
。
解决此问题的一种方法是关闭假脱机(但是您的用户可能必须在发送电子邮件时等待),或者您可以创建自己的事件监视器来处理异常。 http://symfony.com/doc/current/cookbook/service_container/event_listener.html
答案 1 :(得分:0)
您可以尝试覆盖config.yml中的Twig异常处理程序:
twig:
debug: %kernel.debug%
strict_variables: %kernel.debug%
exception_controller: MyBundleName:Exception:show
然后创建一个扩展的Exception类:
的Symfony \捆绑\ TwigBundle \控制器\ ExceptionController
读取该文件的源代码,然后覆盖方法以切换当Exception类型为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 Screencast。