Laravel : Comment envoyer un e-mail sur les exceptions d’erreur ?

Larravel Exception

Vous avez créé une nouvelle application Laravel pour votre client et l’avez déployée sur le serveur de production. Tout fonctionnait bien jusqu’à ce qu’un client ait un problème avec l’application à cause d’un code bogué. Il quitte immédiatement l’application, et la même chose arrive avec plusieurs clients avant que vous connaissiez le bug. Vous corrigez le bug, et tout devient normal.

Mais que faire si vous avez été informé immédiatement par e-mail sur le bug et que vous le corrigez le plus tôt possible. Dans Laravel, cela peut être fait facilement et dans ce post, nous allons apprendre comment.

Dans Laravel, toutes les exceptions sont gérées par la classe App\Exceptions\Handler. Cette classe contient deux méthodes: report et render. Nous sommes seulement intéressés par la méthode report. Il est utilisé pour enregistrer les exceptions ou les envoyer à un service externe. Par défaut, la méthode report transmet simplement l’exception à la classe de base où l’exception est enregistrée. Cependant, nous pouvons l’utiliser pour envoyer un email aux développeurs à propos de l’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
}

Ici, nous utilisons la méthode shouldReport pour ignorer les exceptions répertoriées dans la propriété $dontReport du gestionnaire d’exceptions.

Chaque type d’e-mail envoyé par l’application est représenté comme une classe « mailable » dans Laravel. Nous devons donc créer notre classe mailable en utilisant la commande make:mail :

$ php artisan make:mail ExceptionOccured

Cela créera une classe ExceptionOccured dans le répertoire app/Mail.

Le simple envoi du courrier ne résoudra pas le problème. Nous avons besoin de la trace de pile complète de l’exception. Et pour cela, nous pouvons utiliser le composant Debug de Symfony.

public function sendEmail(Exception $exception)
{
    try {
        $e = FlattenException::create($exception);

        $handler = new SymfonyExceptionHandler();

        $html = $handler->getHtml($e);

        Mail::to('developer@gmail.com')->send(new ExceptionOccured($html));
    } catch (Exception $ex) {
        dd($ex);
    }
}

Assurez-vous d’ajouter le code suivant en haut du fichier:

use Mail;
use Symfony\Component\Debug\Exception\FlattenException;
use Symfony\Component\Debug\ExceptionHandler as SymfonyExceptionHandler;
use App\Mail\ExceptionOccured;

Ensuite, dans votre classe ExceptionOccured :

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);
    }
}

Ajoutez le code suivant dans votre fichier de vue emails.exception :

{!! $content !!}

Maintenant, chaque fois qu’une exception est levée dans votre application, vous recevrez un e-mail avec une trace de pile complète. Excellent!

1 commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Résoudre : *
22 + 17 =