【问题标题】:Catch swiftmailer exception in Symfony2 dev env controller在 Symfony2 开发环境控制器中捕获 swiftmailer 异常
【发布时间】:2014-10-12 06:01:31
【问题描述】:

我不确定为什么我没有在我的控制器中捕获来自 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 对某些异常或某些控制器的捕获?

【问题讨论】:

  • 我认为您可以通过覆盖 Twig 异常处理程序来做到这一点。不过,我不是 100% 确定。请参阅下面的答案。

标签: symfony swiftmailer


【解决方案1】:

当您执行$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

【讨论】:

    【解决方案2】:

    您可以尝试覆盖 config.yml 中的 Twig 异常处理程序:

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

    然后创建一个扩展的异常类:

    Symfony\Bundle\TwigBundle\Controller\ExceptionController

    读取该文件的源代码,然后重写方法以在异常类型为 Swift_TransportException 时切换渲染哪个模板

    您可以通过在 showAction() 中设置一个类变量并将其传递给 findTemplate() 来做到这一点

    显示动作:

    $this->exceptionClassName = $exception->getClass();

    查找模板:

    if (!$debug && $this->exceptionClassName == 'MyBundle\Exception\GenericNotFoundException') {
    
                return 'BundleName:Exception:generic404.html.twig';
            }
    

    如需更多信息,我推荐 KNPUniversity Symfony Screencasts。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多