ارسال ایمیل در صورت بروز یک exception در لاراول

خطاها یا exceptionها در هر برنامه‌ای ممکن است رخ دهند، می‌توان در صورت بروز یک exception، یک ایمیل به توسعه دهنده فرستاد تا از بروز مشکل مطلع شده و اقدام به حل آن کند.


فرض کنید، شما یک برنامه کاربردی لاراول برای مشتریان خود ایجاد کرده و آن را بر روی سرور مستقر کرده‌اید. همه کارها به درستی انجام می‌شود تا زمانی که یک مشتری به دلیل برخی از کدهای اشتباه در برنامه به مشکل برمی‌خورد. نتیجه این است که او بلافاصله برنامه را ترک می‌کند، این کار توسط چندین مشتری انجام می‌شود قبل از این که شما اطلاعی در مورد این موضوع داشته باشید. اگر شما مشکل را رفع کنید همه کارها به درستی پیش خواهد رفت.

اگر شما بلافاصله از طریق ایمیل (یا سرویس دیگری) درباره مشکل رخ داده مطلع شوید، می‌توانید به راحی آن مشکل را برطرف کنید. در یک برنامه لاراول، می‌توان به راحتی این کار را انجام داد و در این مقاله، ما قصد داریم نحوه انجام این کار را با هم بیاموزیم.

exception

ارسال ایمیل در صورت بروز یک exception در لاراول

در یک برنامه لاراول، تمام خطاها یا استثناها (exception) توسط کلاس App\Exceptions\Handler مدیریت می‌شوند. این کلاس شامل دو متد است، report و render . ما فقط با متد report کار داریم؛ این متد برای لاگ کردن استثنا (log exceptions) یا ارسال آن‌ها به یک سرویس خارجی مانند Bugsnag یا Sentry مورد استفاده قرار می‌گیرد. در حالت پیش‌فرض، متد report به سادگی exception را به کلاس پایه‌ای که در آن log شده است، منتقل می‌کند. با این حال، می‌توانیم در زمان رخ دادن یک exception از آن برای فرستادن ایمیل به توسعه دهنده نیز استفاده کنیم.

/**
* 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 برای نادیده گرفتن (ignore) یک exception استفاده می‌کنیم که در ویژگی $dontReport از exception handler قرار دارد.

هر نوع ایمیل ارسال شده توسط برنامه لاراول به عنوان یک کلاس mailable نمایش داده می‌شود. بنابراین، ما باید کلاس mailable ما را توسط دستور آرتیسان make: mail ایجاد کنیم:

$ php artisan make:mail ExceptionOccured

این دستور، یک کلاس ExceptionOccured در دایرکتوری app/Mail ایجاد می‌کند.
اما فقط ارسال ایمیل مشکل ما را حل نمی‌کند. ما نیاز به ردیابی کامل پشته از exception داریم و برای این منظور، می‌توانیم از کامپوننت Debug سیمفونی استفاده کنیم.

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 برای جلوگیری از ایجاد حلقه بی نهایت در صورت اجرا نشدن دستور mail استفاده کردیم.
سپس، در کلاس ارسال ایمیل 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 !!}

اکنون، هر وقت یک exception در برنامه رخ دهد، شما یک ایمیل با ردیابی کامل پشته exception دریافت خواهید کرد. به همین راحتی!

یک پکیج لاراول به نام squadboat / sneaker ایجاد شده است که تمام این کارها را برای شما انجام می‌دهد تا با خیال راحت بتوانید روی حل مشکل تمرکز کنید.

برخی از ویژگی‌های پکیج squadboat / sneaker عبارت است از:

  • روشن / خاموش کردن ایمیل توسط فایل .env.
  • سفارشی کردن بدنه ایمیل
  •  نادیده گرفتن exception تولید شده توسط botها.

می‌توانید برای دریافت اطلاعات و سورس کد بیشتر در این زمینه به Github سر بزنید.

آموزش‌های بیشتر در لیداوب:

آموزش پایه لاراول ۵,۵

آموزش CSS

آموزش HTML مقدماتی

در این مقاله از لیداوب نیز به یکی دیگر از نکات کاربردی لاراول پرداختیم. برای دریافت اخرین اخبار درباره فریم ورک لاراول و همچنین طراحی سایت و آموزش سئو مقالات ما در کتابخانه آنلاین لیداوب را دنبال کنید.