本文概述
应用程序由于编码质量差而失败, 或者仅仅是因为你忘记捕获根本不应该失败的代码。无论是什么原因, 你显然都想知道什么时候采取对策。在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清除你的项目应用程序, 并且当你的应用程序中有未处理的异常时, 将发送一封电子邮件通知你有关该异常的信息(带有说明)。
编码愉快!
评论前必须登录!
注册