adaptit-darshan/exception-notifier
Composer 安装命令:
composer require adaptit-darshan/exception-notifier
包简介
Production-ready exception notification system for Laravel 12+ with intelligent rate limiting, critical exception handling, and customizable email templates. Major v2.0 upgrade with modern Laravel 12 support.
关键字:
README 文档
README
Version 2.0 - Major upgrade with Laravel 12+ support! 🚀
Laravel Exception Notifier is a production-ready exception notification system for Laravel 12+ applications. Get instant email alerts when exceptions occur in your application with intelligent rate limiting, customizable templates, and comprehensive context data.
🆕 What's New in v2.0
- ✨ Laravel 12+ Support - Modern
bootstrap/app.phppattern - ✨ PHP 8.2+ Required - Latest PHP features and performance
- ✨ Per-Signature Rate Limiting - Each exception tracked separately
- ✨ Critical Exception Bypass - Important errors always notify
- ✨ Enhanced Bot Detection - Better false positive filtering
- ✨ Zero-Loop Guarantee - Fixed infinite loop bug with dependency injection
- ✨ Email Branding - Customizable logo, colors, and footer
Upgrading from v1.x? See UPGRADE.md for migration guide.
✨ Features
- 🚨 Instant Email Notifications - Get notified immediately when exceptions occur
- 🎯 Smart Rate Limiting - Per-exception-signature rate limiting to prevent email spam
- 🔥 Critical Exception Bypass - Critical exceptions always bypass rate limits
- 📊 Rich Context Data - Stack traces, request details, user information, and more
- 🎨 Customizable Email Templates - Beautiful, responsive HTML email templates
- 🤖 Bot Detection - Automatically ignore exceptions from bots and crawlers
- 🔧 Artisan Commands - Manage rate limits and test notifications via CLI
- 🌍 Environment-Aware - Silent mode in local environment during development
- 📝 Detailed Logging - All exceptions still logged even when email suppressed
- ⚡ Zero Performance Impact - Notifications wrapped in try-catch to never break your app
📋 Requirements
- PHP 8.2 or higher
- Laravel 12.0 or higher
- Mail configuration (SMTP, Mailgun, SES, etc.)
📦 Installation
Install the package via Composer:
composer require damku999/exception-notifier
Publish Configuration
Publish the configuration file:
php artisan vendor:publish --tag="exception-notifier-config"
This will create config/exception_notifier.php with all available options.
Publish Email Templates (Optional)
If you want to customize the email templates:
php artisan vendor:publish --tag="exception-notifier-views"
Templates will be published to resources/views/vendor/exception-notifier/.
Publish Migrations (Optional)
If you want to use database-backed rate limiting:
php artisan vendor:publish --tag="exception-notifier-migrations"
php artisan migrate
⚙️ Configuration
Environment Variables
Add these to your .env file:
# Enable exception email notifications (default: false) EXCEPTION_EMAIL_ENABLED=true # Silent mode in local environment (default: true) EXCEPTION_EMAIL_SILENT_LOCAL=true # Email recipients (comma-separated) EXCEPTION_EMAIL_TO=admin@example.com,dev@example.com # Rate limiting (default: 10 emails per hour per signature) EXCEPTION_EMAIL_MAX_PER_HOUR=10 EXCEPTION_EMAIL_RATE_WINDOW=3600
Basic Setup
Update your bootstrap/app.php to use the exception notifier:
<?php use Damku999\ExceptionNotifier\JsonExceptionHandler; use Illuminate\Foundation\Application; use Illuminate\Foundation\Configuration\Exceptions; use Illuminate\Foundation\Configuration\Middleware; return Application::configure(basePath: dirname(__DIR__)) ->withRouting( web: __DIR__.'/../routes/web.php', api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', health: '/up', ) ->withMiddleware(function (Middleware $middleware) { // }) ->withExceptions(function (Exceptions $exceptions) { $exceptions->render(function (Throwable $e) { return app(JsonExceptionHandler::class)->handle($e); }); })->create();
Advanced Configuration
Edit config/exception_notifier.php for advanced options:
return [ // Enable/disable globally 'enabled' => env('EXCEPTION_EMAIL_ENABLED', false), // Silent mode in local environment 'silent_in_local' => env('EXCEPTION_EMAIL_SILENT_LOCAL', true), // Email recipients 'recipients' => array_filter(array_map('trim', explode(',', env('EXCEPTION_EMAIL_TO', '')))), // Fallback recipients if none specified 'fallback_recipients' => ['admin@example.com'], // Rate limiting 'max_emails_per_signature_per_hour' => env('EXCEPTION_EMAIL_MAX_PER_HOUR', 10), 'rate_limit_window' => env('EXCEPTION_EMAIL_RATE_WINDOW', 3600), // Ignored exceptions (won't send emails) 'ignored_exceptions' => [ \Illuminate\Validation\ValidationException::class, \Symfony\Component\HttpKernel\Exception\NotFoundHttpException::class, \Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException::class, \Illuminate\Auth\AuthenticationException::class, ], // Critical exceptions (bypass rate limits) 'critical_exceptions' => [ \Illuminate\Database\QueryException::class, ], // Bot user agents to ignore 'ignored_bots' => [ 'googlebot', 'bingbot', 'crawler', 'spider', 'bot', ], // Include context data in emails 'include_request_data' => true, 'include_user_data' => true, 'include_stack_trace' => true, 'max_stack_trace_depth' => 10, // Send suppression notice when rate limit reached 'send_suppression_notice' => true, ];
🚀 Usage
Automatic Exception Handling
Once configured in bootstrap/app.php, the package automatically catches and notifies you of exceptions:
// Any uncaught exception will trigger an email notification throw new \Exception('Something went wrong!'); // Validation exceptions are ignored by default (configurable) throw ValidationException::withMessages(['email' => 'Invalid email']); // Database exceptions are marked as critical (always sent) DB::table('non_existent')->get(); // Triggers critical email
Manual Exception Notification
You can manually trigger exception notifications:
use Damku999\ExceptionNotifier\Facades\ExceptionNotifier; try { // Your code } catch (\Throwable $e) { ExceptionNotifier::notify($e); // Continue with your error handling }
Checking Rate Limits
use Damku999\ExceptionNotifier\Facades\ExceptionNotifier; // Check if rate limit exceeded for specific exception $signature = ExceptionNotifier::generateSignature($exception); $exceeded = ExceptionNotifier::isRateLimitExceeded($signature); // Get current count for signature $count = ExceptionNotifier::getRateLimitCount($signature); // Get all rate limit statuses $statuses = ExceptionNotifier::getRateLimitStatus();
🔧 Artisan Commands
View Rate Limit Status
View current rate limit status for all exception signatures:
php artisan exception:rate-limit-status
Output:
┌──────────────────────────────────────────────────────────────┬───────┬─────┬──────────┐
│ Exception Signature │ Count │ Max │ TTL (s) │
├──────────────────────────────────────────────────────────────┼───────┼─────┼──────────┤
│ Exception:app/Http/Controllers/UserController.php:45 │ 8 │ 10 │ 2847 │
│ QueryException:app/Models/User.php:123 │ 15 │ 10 │ 1523 │
└──────────────────────────────────────────────────────────────┴───────┴─────┴──────────┘
Clear Rate Limits
Clear all rate limits:
php artisan exception:clear-rate-limits
Clear specific signature:
php artisan exception:clear-rate-limits --signature="Exception:app/Http/Controllers/UserController.php:45"
Test Exception Emails
Send a test exception email:
php artisan exception:test
Send test with custom exception type:
php artisan exception:test --type=critical
📧 Email Templates
The package includes two beautiful, responsive email templates:
Exception Notification Email
Sent when an exception occurs (within rate limits):
- Exception Summary - Class, message, file, line, signature
- Stack Trace - Formatted call stack with file/line numbers
- Request Details - URL, method, IP, user agent
- User Context - Authenticated user information
- Environment Info - Environment name and timestamp
- Rate Limit Status - Current count vs maximum allowed
Rate Limit Suppression Email
Sent once when rate limit is reached:
- Rate Limit Info - Signature, max count, time remaining
- What This Means - Explanation of suppression
- Action Required - Steps to investigate and resolve
- Helpful Commands - CLI commands to manage rate limits
Customizing Templates
Publish the views and edit them:
php artisan vendor:publish --tag="exception-notifier-views"
Templates location: resources/views/vendor/exception-notifier/
Customizing Email Branding
Override the branding configuration:
// In your AppServiceProvider or config config([ 'exception_notifier.branding' => [ 'email_logo' => 'images/logo.png', 'primary_color' => '#007bff', 'text_color' => '#333333', 'footer_text' => 'Your Company Name', 'support_email' => 'support@example.com', ], ]);
🧪 Testing
Run the test suite:
composer test
Run tests with coverage:
composer test:coverage
📊 Exception Signature Format
The package generates unique signatures for each exception using:
Format: ExceptionClass:FilePath:LineNumber
Example: Exception:app/Http/Controllers/UserController.php:45
This ensures:
- ✅ Same exception at same location = same signature
- ✅ Rate limiting works per unique error
- ✅ Different locations = different signatures
🔒 Security
Preventing Infinite Loops
The package is designed to never break your application:
// In JsonExceptionHandler try { $this->notifierService->notify($e); } catch (Throwable $notificationError) { // Silently fail if notification fails Log::error('Exception notification failed', [ 'error' => $notificationError->getMessage(), ]); }
Bot Protection
Automatically ignores exceptions from bots to prevent spam:
'ignored_bots' => [ 'googlebot', 'bingbot', 'slurp', 'crawler', 'spider', 'bot', 'facebookexternalhit', 'twitterbot', 'whatsapp', 'telegram', 'curl', 'wget', ],
🤝 Contributing
Contributions are welcome! Please see CONTRIBUTING.md for details.
Development Setup
# Clone the repository git clone https://github.com/damku999/exception-notifier.git cd exception-notifier # Install dependencies composer install # Run tests composer test # Run code style checks composer lint
📝 Changelog
Please see CHANGELOG.md for recent changes.
📄 License
The MIT License (MIT). Please see LICENSE.md for more information.
🙏 Credits
- Author: Darshan Baraiya
- GitHub: @damku999
- Built with: Laravel 12, PHP 8.2
💡 Use Cases
Perfect for:
- 🏢 Production Applications - Monitor critical production errors
- 🔧 Staging Environments - Catch bugs before production
- 📊 API Services - Track API failures and exceptions
- 🚀 Microservices - Centralized exception monitoring
- 👥 Team Collaboration - Multiple developers receive alerts
🆘 Support
Developed by Darshan Baraiya
adaptit-darshan/exception-notifier 适用场景与选型建议
adaptit-darshan/exception-notifier 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 1.18k 次下载、GitHub Stars 达 6, 最近一次更新时间为 2024 年 09 月 12 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「email」 「exception」 「error」 「monitoring」 「notification」 「laravel」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 adaptit-darshan/exception-notifier 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 adaptit-darshan/exception-notifier 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 adaptit-darshan/exception-notifier 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
PHP Error Handler module that captures and displays all throwable errors in a given format, making debugging easier and more efficient
Extensible library for building notifications and sending them via different delivery channels.
Email+ extends Kirby's email capabilities by adding support for multiple email services using the same Kirby email API.
Error and Exception override and observers.
Error handler based on Booboo with HTML and JSON support
Error Share App, for handle error page
统计信息
- 总下载量: 1.18k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 7
- 点击次数: 42
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2024-09-12