Send php exceptions to email, microsoft teams, slack.
    
    Notifications are throttle enabled so devs don't get a lot of emails from one host
    
    (or all hosts if cache driver is shared).
| Channels | Progress | 
|---|---|
| Supported | |
| Microsoft Teams | Supported | 
| Slack | Supported | 
| Pager Duty | Supported | 
composer require kevincobain2000/laravel-alert-notifications
If you're using Laravel 5.5+ let the package auto discovery make this for you.
'providers' => [
    \Kevincobain2000\LaravelAlertNotifications\AlertNotificationsServiceProvider::class
]
composer install
composer run test
php artisan vendor:publish --provider="Kevincobain2000\LaravelAlertNotifications\AlertNotificationsServiceProvider"
php artisan config:cache
Since Lumen doesn't support auto-discovery, move config and view files to the destination directories manually
cp vendor/kevincobain2000/laravel-alert-notifications/src/config/laravel_alert_notifications.php config/laravel_alert_notifications.php
mkdir -p "resources/views/vendor/laravel_alert_notifications/" && cp vendor/kevincobain2000/laravel-alert-notifications/src/views/* resources/views/vendor/laravel_alert_notifications/and add the following to bootstrap/app.php:
$app->register(Kevincobain2000\LaravelAlertNotifications\AlertNotificationsServiceProvider::class);ALERT_NOTIFICATION_MAIL_FROM_ADDRESS=
ALERT_NOTIFICATION_MAIL_TO_ADDRESS=
ALERT_NOTIFICATION_MAIL_NOTICE_TO_ADDRESS=
ALERT_NOTIFICATION_MAIL_WARNING_TO_ADDRESS=
ALERT_NOTIFICATION_MAIL_ERROR_TO_ADDRESS=
ALERT_NOTIFICATION_MAIL_CRITICAL_TO_ADDRESS=
ALERT_NOTIFICATION_MAIL_ALERT_TO_ADDRESS=
ALERT_NOTIFICATION_MAIL_EMERGENCY_TO_ADDRESS=
ALERT_NOTIFICATION_CACHE_DRIVER=file
ALERT_NOTIFICATION_MICROSOFT_TEAMS_WEBHOOK=
ALERT_NOTIFICATION_SLACK_WEBHOOK=
ALERT_NOTIFICATION_PAGER_DUTY_INTEGRATION_KEY=
ALERT_NOTIFICATION_CURL_PROXY=
new AlertDispatcher(
    Exception $e
    [, array $dontAlertExceptions = []]         // Exceptions that shouldn't trigger notifications
    [, array $notificationLevelsMapping = []]   // [Exception class => Notification level] mapping
    [, array $exceptionContext = []]            // Array of context data
)In app/Exceptions/Handler.php. It is better to use a try catch to prevent loop.
use Kevincobain2000\LaravelAlertNotifications\Dispatcher\AlertDispatcher;
class Handler extends ExceptionHandler
{
    private $exceptionLogLevels = [
        DebugLevelException::class => LogLevel::DEBUG,
        WarningLevelException::class => LogLevel::WARNING,
        ErrorLevelException::class => LogLevel::ERROR,
    ];
    protected $dontReport = [
        //
    ];
    public function report(Throwable $exception)
    {
        try {
            $dontReport = array_merge($this->dontReport, $this->internalDontReport);
            $alertDispatcher = new AlertDispatcher($exception, $dontReport, $this->exceptionLogLevels);
            $alertDispatcher->notify();
        } catch (Throwable $e) {
            // log any unexpected exceptions or do nothing
        }
        parent::report($exception);
    }
}| config/env key | purpose | 
|---|---|
| throttle_enabled | (default true) If false then library will send alerts without any throttling | 
| throttle_duration_minutes | (default 5 mins) If an exception has been notified | 
| This will next notify after 5 mins when same exception occurs | |
| cache_prefix | This is a prefix for cache key. Your cache key will look like | 
| laravel-alert-notifications-ExceptionClass-ExceptionCode | |
| ALERT_NOTIFICATION_CURL_PROXY | If your slack/MS teams require proxy, then set it up accordingly | 
| default_notification_level | Default notification level | 
| exclude_notification_levels | Do not send notification if it is of one of the listed level | 
| E-mail config array: | |
| mail.enabled | (default true), false will not notify to email | 
| mail.fromAddress | (default null), null will not notify to email | 
| mail.toAddress | Default recipient e-mail address | 
| mail.subject | Default e-mail subject. May contain placeholders replaced afterwards with | 
| correspondent exception data: | |
| %ExceptionMessage%=>$e->getMessage() | |
| %ExceptionCode%=>$e->getCode() | |
| %ExceptionType%=>$e->getType() | |
| %ExceptionLevel%=>current notification level | |
| ex. 'subject' => 'Exception [%ExceptionType%] has ocurred' | |
| mail.#level# | Configs for each notification level | 
| notification levels refer to those defined in \Psr\Log\LogLevel | |
| mail.#level#.toAddress | (default mail.to_address), #level# notification recipient e-mail | 
| mail.#level#.subject | #level# notification e-mail subject | 
| microsoft_teams.enabled | (default true), false will not notify to teams | 
| microsoft_teams.webhook | (default null), null will not notify to teams | 
| slack.enabled | (default true), false will not notify to slack | 
| slack.webhook | (default null), null will not notify to slack | 
| pager_duty.enabled | (default true), false will not notify to pager duty | 
| pager_duty.events_v2_endpoint | (default https://events.pagerduty.com/v2/enqueue), should not need to change this | 
| pager_duty.integration_key | (default null), null with not notify to pager duty | 
- https://qiita.com/kidatti/items/8732114ec4d1727844b8
- https://laravel-news.com/email-on-error-exceptions
Thanks goes to these wonderful people (emoji key):
| Aaron Brigham | Alexander Hupe π | Kit Loong π | Andrew Miller π | Pulkit Kathuria π | Masashi | 
This project follows the all-contributors specification. Contributions of any kind welcome!



