devel8/laravel-action-tracker
Track and query an audit history of actions performed on Eloquent models. Add a trait, define allowed actions, record actions with messages, fetch per-model action logs, and dispatch generic or per-action events for listeners and custom workflows.
Installation
composer require devel8/laravel-action-tracker
php artisan vendor:publish --provider="Devel8\ActionTracker\ActionTrackerServiceProvider" --tag="migrations"
php artisan migrate
action_tracker_actions table).Basic Usage Track an action on a model:
use Devel8\ActionTracker\Facades\ActionTracker;
$user = User::find(1);
ActionTracker::track($user, 'deleted'); // Logs 'deleted' action for user ID 1
Viewing Actions
$actions = ActionTracker::getActions($user); // Returns collection of actions
// Or via relationship (if configured):
$user->actions; // If using `hasMany` in User model
Automatic Tracking via Observers
use Devel8\ActionTracker\Facades\ActionTracker;
class UserObserver {
public function deleted(User $user) {
ActionTracker::track($user, 'deleted');
}
}
Register in AppServiceProvider@boot():
User::observe(UserObserver::class);
Manual Tracking in Controllers
public function destroy(User $user) {
$user->delete();
ActionTracker::track($user, 'deleted');
return redirect()->route('users.index');
}
Attach metadata (e.g., IP, user agent) to actions:
ActionTracker::track($user, 'login', [
'ip' => request()->ip(),
'user_agent' => request()->userAgent(),
]);
Filter by Action Type
$deletedActions = ActionTracker::getActions($user)->where('action', 'deleted');
Scope in Eloquent
Add a local scope to your Action model:
public function scopeRecent($query, $minutes = 5) {
return $query->where('created_at', '>=', now()->subMinutes($minutes));
}
Extend with events (e.g., trigger notifications on critical actions):
use Devel8\ActionTracker\Events\ActionTracked;
ActionTracker::track($user, 'password_reset');
event(new ActionTracked($user, 'password_reset'));
Missing Migrations
php artisan migrate after publishing will break tracking.Performance with Large Datasets
saved) can bloat the database.deleted, updated for sensitive fields).Race Conditions
DB::transaction(function () use ($user) {
ActionTracker::track($user, 'bulk_update');
});
Check Table Structure
Verify action_tracker_actions has columns: model_type, model_id, action, metadata, created_at.
Log Missing Actions Add a debug middleware to log untracked actions:
public function handle($request, Closure $next) {
if (app()->environment('local')) {
ActionTracker::track($request->user(), 'debug_request', [
'path' => $request->path(),
]);
}
return $next($request);
}
Custom Action Models
Extend the Action model to add fields (e.g., actor_id):
php artisan make:model ActionExtension --extend=Devel8\ActionTracker\Models\Action
Update the migration and config.
Action Policies Restrict who can view/track actions:
use Devel8\ActionTracker\Models\Action;
class ActionPolicy {
public function viewAny(User $user) {
return $user->isAdmin();
}
}
Bulk Actions
Optimize bulk inserts with insert instead of loops:
ActionTracker::insert([
['model_type' => 'App\User', 'model_id' => 1, 'action' => 'updated'],
['model_type' => 'App\User', 'model_id' => 2, 'action' => 'updated'],
]);
Model Type Handling
The package uses getMorphClass() for model_type. Ensure your models implement Morphable or override:
public function getMorphClass() {
return class_basename($this);
}
Metadata Serialization Metadata is JSON-encoded. Avoid circular references or large payloads:
// Bad: Can cause serialization errors
ActionTracker::track($user, 'viewed', ['data' => $user->posts]);
// Good: Serialize manually
ActionTracker::track($user, 'viewed', ['post_ids' => $user->posts->pluck('id')]);
How can I help you explore Laravel packages today?