Prerequisites:
laravel-auditing via Composer:
composer require owen-it/laravel-auditing
php artisan vendor:publish --provider="OwenIt\Auditing\AuditingServiceProvider"
php artisan migrate
Install the plugin:
composer require tapp/filament-auditing
Register the plugin in app/Providers/Filament/AdminPanelProvider.php:
public function panel(Panel $panel): Panel
{
return $panel
->plugins([
\Tapp\FilamentAuditing\FilamentAuditingPlugin::make(),
]);
}
First use case:
Add the HasAudits trait to your Filament resource model and include the audit relation manager in your resource:
use Tapp\FilamentAuditing\Concerns\HasAudits;
class PostResource extends Resource
{
public static function form(Form $form): Form
{
return $form
->schema([
// ... your fields
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
// ... your columns
])
->relations([
'audits' => AuditRelationManager::make(),
]);
}
}
Audit Tracking:
HasAudits trait and configuring audit() in the model:
use OwenIt\Auditing\Contracts\Auditable;
use Tapp\FilamentAuditing\Concerns\HasAudits;
class Post implements Auditable
{
use HasAudits;
public static function audit(): array
{
return [
'title', 'content', 'published_at',
];
}
}
Resource Integration:
AuditRelationManager to your resource’s relations() method:
->relations([
'audits' => AuditRelationManager::make()
->searchable(['old_values', 'new_values', 'created_at'])
->sortable(['created_at'])
->paginated(10),
])
Restore Functionality:
laravel-auditing).title or content).Customization:
AuditRelationManager::make()
->columns([
Tables\Columns\TextColumn::make('old.title')
->label('Previous Title'),
Tables\Columns\TextColumn::make('new.title')
->label('Current Title'),
Tables\Columns\TextColumn::make('created_at')
->dateTime(),
])
Bulk Actions:
created_by).created_at).old_values/new_values).Dynamic Audit Fields: Dynamically include/exclude fields based on user roles or conditions:
public static function audit(): array
{
$fields = ['title', 'content'];
if (auth()->user()->isAdmin()) {
$fields[] = 'deleted_at';
}
return $fields;
}
Audit Policies: Use Laravel’s Policy to restrict audit access:
class PostPolicy
{
public function viewAudits(User $user, Post $post)
{
return $user->isAdmin();
}
}
Then register the policy in AuditRelationManager:
AuditRelationManager::make()
->policy(PostPolicy::class)
Export Audits:
Combine with Filament’s ExportAction to export audit logs:
use Filament\Tables\Actions\ExportAction;
AuditRelationManager::make()
->actions([
ExportAction::make()
->filename('audit-logs-' . now()->format('Y-m-d')),
])
Real-Time Notifications:
Trigger notifications when critical audits occur (e.g., published_at changes):
protected static function booted()
{
static::saved(function ($model) {
if ($model->wasChanged('published_at')) {
Notification::send(
auth()->user(),
new AuditNotification($model->audits()->latest()->first())
);
}
});
}
Missing laravel-auditing Setup:
Class 'OwenIt\Auditing\Contracts\Auditable' not found.owen-it/laravel-auditing is installed and the Auditable trait is used in your model.Audit Table Not Showing:
HasAudits trait or audit() method to the model.Auditable and the trait is included.Restore Fails Silently:
old_values or new_values (e.g., non-tracked fields).audit() array.Permission Denied:
canView/canEdit to the resource’s getPages() or use policies.Performance Issues:
paginated() or limit():
AuditRelationManager::make()->paginated(20)
Check Audit Logs:
audits table directly:
php artisan tinker
>>> \App\Models\Post::first()->audits()->latest()->get();
Enable Query Logging:
AppServiceProvider:
public function boot()
{
DB::enableQueryLog();
}
Clear Cached Views:
php artisan view:clear
php artisan cache:clear
Soft Deletes:
laravel-auditing is configured for soft deletes in config/auditing.php:
'soft_deletes' => true,
Custom Audit Model:
App\Models\Audit), extend the plugin’s config:
'model' => \App\Models\Audit::class,
in config/filament-auditing.php.Field-Specific Rollbacks:
public static function audit(): array
{
return [
'title' => ['except' => ['slug']], // Skip 'slug' during rollback
];
}
Custom Audit Actions:
AuditRelationManager::make()
->actions([
Tables\Actions\Action::make('revertAll')
->action(function (Audit $record) {
// Custom logic
}),
])
Override Audit Table:
use Tapp\FilamentAuditing\Tables\AuditTable;
AuditRelationManager::make()
->table(AuditTable::class)
Hook into Audit Events:
audit.created or audit.restored events:
event(new AuditCreated($audit));
Register listeners in EventServiceProvider.Localization:
php artisan vendor:publish --tag=filament-auditing-lang
resources/lang/vendor/filament-auditing/.How can I help you explore Laravel packages today?