学习如何在错误异常时发送电子邮件
发布于 作者: Amit Gupta
您为客户创建了一个新的 Laravel 应用程序,并在生产服务器上部署了它。一切运行良好,直到客户因某些有问题的代码而遇到应用程序问题。他立即离开了应用程序,在您知道错误之前,多个客户都遇到了同样的问题。您修复了错误,然后一切都恢复正常。
但是,如果您可以通过电子邮件(或其他服务)立即收到有关错误的通知,您就可以尽快修复它。在 Laravel 中,这可以轻松实现,在这篇文章中,我们将学习如何实现。
在 Laravel 中,所有异常都由 App\Exceptions\Handler
类处理。此类包含两个方法:report
和 render
。我们只对 report
方法感兴趣;它用于记录异常或将异常发送到外部服务,例如 Bugsnag 或 Sentry。默认情况下,report
方法只是将异常传递给基类,在那里记录异常。但是,我们可以使用它将有关异常的电子邮件发送给开发人员。
/** * Report or log an exception. * * This is a great spot to send exceptions to Emails. * * @param \Exception $exception * @return void */public function report(Exception $exception){ if ($this->shouldReport($exception)) { $this->sendEmail($exception); // sends an email } return parent::report($exception);} /** * Sends an email to the developer about the exception. * * @param \Exception $exception * @return void */public function sendEmail(Exception $exception){ // sending email}
这里我们使用 shouldReport
方法来忽略异常处理程序的 $dontReport
属性中列出的异常。
应用程序发送的每种类型的电子邮件都用 Laravel 中的“可邮件”类表示。因此,我们需要使用 make:mail
命令创建我们的可邮件类
$ php artisan make:mail ExceptionOccured
这将在 app/Mail
目录中创建一个名为 ExceptionOccured
的类。
仅仅发送邮件并不能解决问题。我们需要异常的完整堆栈跟踪。为此,我们可以使用 Symfony 的调试组件。
public function sendEmail(Exception $exception){ try { $e = FlattenException::create($exception); $handler = new SymfonyExceptionHandler(); $html = $handler->getHtml($e); Mail::to('[email protected]')->send(new ExceptionOccured($html)); } catch (Exception $ex) { dd($ex); }}
确保在文件顶部添加以下代码
use Mail;use Symfony\Component\Debug\Exception\FlattenException;use Symfony\Component\Debug\ExceptionHandler as SymfonyExceptionHandler;use App\Mail\ExceptionOccured;
注意——我们使用了 try
块来避免如果邮件命令失败,则会出现无限循环。
然后,在您的 ExceptionOccured
邮件类中
<?php namespace App\Mail; use Illuminate\Bus\Queueable;use Illuminate\Mail\Mailable;use Illuminate\Queue\SerializesModels;use Illuminate\Contracts\Queue\ShouldQueue; class ExceptionOccured extends Mailable{ use Queueable, SerializesModels; /** * The body of the message. * * @var string */ public $content; /** * Create a new message instance. * * @return void */ public function __construct($content) { $this->content = $content; } /** * Build the message. * * @return $this */ public function build() { return $this->view('emails.exception') ->with('content', $this->content); }}
在您的 emails.exception
视图文件中添加以下代码
{!! $content !!}
现在,只要您的应用程序中出现异常,您就会收到包含完整堆栈跟踪的电子邮件。很酷吧!
我创建了一个名为 squareboat/sneaker 的 Laravel 软件包,为您完成所有这些繁琐的工作,以便您可以专注于解决错误。
sneaker 的一些功能包括:– 使用 .env
文件打开/关闭电子邮件。– 自定义电子邮件正文。– 忽略由机器人生成的异常。
还有更多功能即将推出。
如果您想要此的完整源代码,我很乐意分享,您可以在 GitHub 上找到源代码
热爱编码,帮助他人时充满乐趣。目前,我是 Laravel 框架的忠实粉丝,现在我被一些人称为“布道者”。我喜欢帮助他人学习更多关于 Laravel 的知识,并帮助他们踏上成功的道路。我经常在 Stackoverflow 的 #laravel 中闲逛。我已经开发了 Web 和移动应用程序等等,大约有两年了,我一直在不断学习。