A Simple & Beautiful Exception Viewer for FilamentPHP's Admin Panel
Version Compatibility:
- Filament 4.x → use version 4.x
- Filament 3.x → use version 3.x
- Filament 2.x → use version 1.x
- You can install the package via composer:
composer require bezhansalleh/filament-exceptions- Publish and run the migration via:
php artisan exceptions:install- Register the plugin for the Filament Panel
public function panel(Panel $panel): Panel
{
return $panel
->plugins([
\BezhanSalleh\FilamentExceptions\FilamentExceptionsPlugin::make()
]);
}That's it! The package automatically registers itself with Laravel's exception handler and starts recording exceptions.
Important
The plugin follows Filament's theming rules. So, to use the plugin create a custom theme if you haven't already, and add the following line to your theme.css file:
@source '../../../../vendor/bezhansalleh/filament-exceptions/resources/views/**/*.blade.php';Now build your theme using:
npm run buildBy default, exceptions are recorded automatically. You can control this behavior in your AppServiceProvider's boot() method:
use BezhanSalleh\FilamentExceptions\FilamentExceptions;
public function boot(): void
{
// Stop recording exceptions
FilamentExceptions::stopRecording();
// Resume recording
FilamentExceptions::startRecording();
// Check if recording is active
FilamentExceptions::isRecording();
}Use recordUsing() to define custom logic for when exceptions should be recorded:
use BezhanSalleh\FilamentExceptions\FilamentExceptions;
public function boot(): void
{
// Only record in production
FilamentExceptions::recordUsing(fn () => app()->isProduction());
// Skip specific exception types
FilamentExceptions::recordUsing(function (Throwable $e) {
return ! $e instanceof \Illuminate\Validation\ValidationException
&& ! $e instanceof \Illuminate\Auth\AuthenticationException;
});
// Combine multiple conditions
FilamentExceptions::recordUsing(function (Throwable $e) {
if (! app()->isProduction()) {
return false;
}
// Skip 4xx HTTP exceptions
if ($e instanceof \Symfony\Component\HttpKernel\Exception\HttpException
&& $e->getStatusCode() < 500) {
return false;
}
return true;
});
}When registering the FilamentExceptions plugin, you can chain various methods to customize its behavior. Here are all available configuration options:
FilamentExceptionsPlugin::make()
->navigationBadge(bool | Closure $condition = true)
->navigationBadgeColor(string | array | Closure $color)
->navigationGroup(string | Closure | null $group)
->navigationParentItem(string | Closure | null $item)
->navigationIcon(string | Closure | null $icon)
->activeNavigationIcon(string | Closure | null $icon)
->navigationLabel(string | Closure | null $label)
->navigationSort(int | Closure | null $sort)
->registerNavigation(bool | Closure $shouldRegisterNavigation)
->subNavigationPosition(SubNavigationPosition | Closure $position)FilamentExceptionsPlugin::make()
->modelLabel(string | Closure | null $label)
->pluralModelLabel(string | Closure | null $label)
->titleCaseModelLabel(bool | Closure $condition = true)
->globallySearchable(bool | Closure $condition = true)FilamentExceptionsPlugin::make()
->modelPruneInterval(Carbon $interval)Note This requires laravel scheduler to be setup and configured in order to work. You can see how to do that here Running The Scheduler
FilamentExceptionsPlugin::make()
->scopeToTenant(bool | Closure $condition = true)
->tenantOwnershipRelationshipName(string | Closure | null $ownershipRelationshipName)
->tenantRelationshipName(string | Closure | null $relationshipName)FilamentExceptionsPlugin::make()
->cluster(string | Closure | null $cluster)
->slug(string | Closure | null $slug)Example usage:
return $panel
->plugins([
FilamentExceptionsPlugin::make()
->navigationLabel('Error Logs')
->navigationIcon('heroicon-o-bug-ant')
->navigationBadge()
->navigationGroup('System')
->modelPruneInterval(now()->subDays(7))
]);- Extend the base model as follow:
<?php
namespace App\Models;
use BezhanSalleh\FilamentExceptions\Models\Exception as BaseException;
class MyCustomException extends BaseException
{
...
}- Then, in a service provider's
boot()method for instanceAppServiceProvider:
use App\Models\MyCustomException;
use BezhanSalleh\FilamentExceptions\FilamentExceptions;
...
public function boot()
{
FilamentExceptions::model(MyCustomException::class);
}
...Publish the translations with
php artisan vendor:publish --tag=filament-exceptions-translationscomposer testPlease see CHANGELOG for more information on what has changed recently.
Please see CONTRIBUTING for details.
Please review our security policy on how to report security vulnerabilities.
The MIT License (MIT). Please see License File for more information.