如何在Symfony 1.4中使用sfErrorNotifierPlugin通过电子邮件自动报告异常

本文概述

  • 1.创建插件结构
  • 2.创建通知类
  • 3.创建插件配置类
  • 4.启用插件
应用程序由于编码质量差而失败, 或者仅仅是因为你忘记捕获根本不应该失败的代码。无论是什么原因, 你显然都想知道什么时候采取对策。在symfony 1.4中, 有一种非常简单的方法可以将一些操作附加到事件分发程序上。
【如何在Symfony 1.4中使用sfErrorNotifierPlugin通过电子邮件自动报告异常】在本文中, 我们将向你简要说明如何通过电子邮件自动报告Symfony 1.4应用程序的异常。
1.创建插件结构在plugins目录内, 你将需要创建一个目录, 其名称为sfErrorEmailNotifierPlugin。在此目录中, 你将创建具有2个类的2个目录, 如下列表所示:
  • sfErrorEmailNotifierPlugin
    • 配置
      • sfErrorEmailNotifierPluginConfiguration.class.php
    • LIB
      • sfErrorEmailNotifierPlugin.php
下一步, 我们将为你提供每个类的内容, 到目前为止, 重要的一步是使用所提到的结构(yourproject / plugins)创建目录。
2.创建通知类sfErrorEmailNotifier类将包含在你的应用程序上引发未处理的异常时将执行的代码。将连接到应用程序的application.throw_exceptions事件的调度程序, 将在指定的类中触发定义的静态函数。在我们的例子中, 我们将有一个方法notify, 它接收第一个参数sfEvent对象作为对象, 它将基本上操纵该事件以提取错误信息并发送电子邮件:
< ?php/** * This class notifies via Email details about exceptions on the application. * * @packagesymfony * @subpackage plugin * @authorCarlos Delgado < dev@ourcodeworld.com> */class sfErrorEmailNotifier {static public function notify(sfEvent $event) {$email = "email@email.com"; $passwordEmail = "12345"; $date = date('d/m/Y H:i:s'); $exception = $event-> getSubject(); $context = sfContext::getInstance(); $env = 'n/a'; if ($conf = sfContext::getInstance()-> getConfiguration()) {$env = $conf-> getEnvironment(); } // The notification should be sent only in production mode, not in development environmentif($env == "prod"){try{$data = http://www.srcmini.com/array(); $data['className'] = get_class($exception); $data['message'] = !is_null($exception-> getMessage()) ? $exception-> getMessage() : 'n/a'; $data['moduleName'] = $context-> getModuleName(); $data['actionName'] = $context-> getActionName(); $data['uri'] = $context-> getRequest()-> getUri(); $data['line'] = $exception-> getLine(); $data['file'] = $exception-> getFile(); $subject = "Unhandled exception: {$_SERVER['HTTP_HOST']} Exception - $env - {$data['message']}"; // 1. Build email HTML$emailContent = < < < EOF< h1> Automatic error report in your application< /h1> < p> Date: {$fecha}< /p> < br> < p> Subject: < b> {$subject}< /b> < /p> < br> < p> An exception has been registered on the production environment, details as follow:< /p> < ul> < li> Exception type: < b> {$data['className']}< /b> < /li> < li> Message: < b> {$data['message']}< /b> < /li> < /ul> < p> The exception was thrown in:< /p> < ul> < li> URI: < b> {$data['uri']}< /b> < /li> < li> Module: < b> {$data['moduleName']}< /b> < /li> < li> Action: < b> {$data['actionName']}< /b> < /li> < li> File: < b> {$data['file']}< /b> < /li> < li> Line: < b> {$data['line']}< /b> < /li> < /ul> EOF; // 2. Send email// The transport message configuration may change according to your email service$transport = \Swift_SmtpTransport::newInstance('smtp.mailserver.com', 465, 'ssl')-> setUsername($email)-> setPassword($passwordEmail); $mailer = \Swift_Mailer::newInstance($transport); $message = \Swift_Message::newInstance("Automatic error report in {$nombreAplicacion}")-> setFrom(array($email => 'Automatic error report'))-> setTo(array("targetemail@mail.com" => "targetemail@mail.com"))-> setBody($emailContent, 'text/html'); // Enviar mail$mailer-> send($message); }catch(Exception $e){}}}}

3.创建插件配置类现在你已经具有发送电子邮件的代码, 你需要创建一个配置类, 该类将在以后注册时初始化该插件, sfErrorEmailNotifierPluginConfiguration.class.php的内容如下(yourproject / plugins / sfErrorEmailNotifierPlugin / config / sfErrorEmailNotifierPluginConfiguration.class.php):
< ?php/** * Plugin configuration. * * @packagesymfony * @subpackage sfErrorEmailNotifier * @authorCarlos Delgado < dev@ourcodeworld.com> */class sfErrorEmailNotifierPluginConfiguration extends sfPluginConfiguration {public function initialize() {// Registrar a evento global de reporte de errores$this-> dispatcher-> connect('application.throw_exception', array('sfErrorEmailNotifier', 'notify')); }}

4.启用插件最后, 要启用创建的插件, 你需要使用sfProjectConfiguration类(yourproject / config / ProjectConfiguration.class.php)中的enablePlugins方法将其添加到应用程序中:
< ?phprequire_once dirname(__FILE__) . '/../symfony-1.4.27/lib/autoload/sfCoreAutoload.class.php'; sfCoreAutoload::register(); class ProjectConfiguration extends sfProjectConfiguration {public function setup() {// 1. Enable plugin$this-> enablePlugins(array('sfErrorEmailNotifierPlugin')); }}

将更改保存到文件中后, 使用php symfony cache:clear清除你的项目应用程序, 并且当你的应用程序中有未处理的异常时, 将发送一封电子邮件通知你有关该异常的信息(带有说明)。
编码愉快!

    推荐阅读