个性化阅读
专注于IT技术分析

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

本文概述

应用程序由于编码质量差而失败, 或者仅仅是因为你忘记捕获根本不应该失败的代码。无论是什么原因, 你显然都想知道什么时候采取对策。在symfony 1.4中, 有一种非常简单的方法可以将一些操作附加到事件分发程序上。

在本文中, 我们将向你简要说明如何通过电子邮件自动报告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.
 * 
 * @package    symfony
 * @subpackage plugin
 * @author     Carlos 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 environment
        if($env == "prod"){
            try{
                $data = 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.
 * 
 * @package    symfony
 * @subpackage sfErrorEmailNotifier
 * @author     Carlos 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方法将其添加到应用程序中:

<?php

require_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清除你的项目应用程序, 并且当你的应用程序中有未处理的异常时, 将发送一封电子邮件通知你有关该异常的信息(带有说明)。

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在Symfony 1.4中使用sfErrorNotifierPlugin通过电子邮件自动报告异常

评论 抢沙发

评论前必须登录!