PHPackages                             whilesmart/eloquent-activities - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. whilesmart/eloquent-activities

ActiveLibrary

whilesmart/eloquent-activities
==============================

Flexible activity tracking package for Laravel applications with actor-action-subject pattern

035↓100%PHP

Since Mar 8Pushed 2mo agoCompare

[ Source](https://github.com/whilesmartphp/eloquent-activities)[ Packagist](https://packagist.org/packages/whilesmart/eloquent-activities)[ RSS](/packages/whilesmart-eloquent-activities/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

Eloquent Activities
===================

[](#eloquent-activities)

Flexible activity tracking package for Laravel applications using the **Actor-Action-Subject** pattern.

Features
--------

[](#features)

- **Actor-Action-Subject Pattern**: Track who did what to what
- **Polymorphic Relationships**: Works with any Eloquent model
- **Flexible Context**: Scope activities to workspaces, projects, organizations, etc.
- **Multiple Sources**: Track activities from manual entry, webhooks, API, system events, and integrations
- **Rich Metadata**: Store flexible properties and metadata with each activity
- **Powerful Query Scopes**: Filter activities by actor, subject, context, action, source, and date range
- **Easy Integration**: Simple trait to add activity tracking to any model
- **Configurable**: Customize routes, middleware, and features via configuration
- **Laravel 11+ &amp; 12+ Support**: Compatible with modern Laravel versions

Installation
------------

[](#installation)

Install via Composer:

```
composer require whilesmart/eloquent-activities
```

### Publish Configuration (Optional)

[](#publish-configuration-optional)

```
php artisan vendor:publish --tag=activities-config
```

### Run Migrations

[](#run-migrations)

```
php artisan migrate
```

Quick Start
-----------

[](#quick-start)

### 1. Add the Trait to Your Models

[](#1-add-the-trait-to-your-models)

```
use Whilesmart\Activities\Traits\HasActivities;

class Task extends Model
{
    use HasActivities;

    // ...
}
```

### 2. Create Activities

[](#2-create-activities)

```
use Whilesmart\Activities\Models\Activity;

// Simple activity
Activity::create([
    'actor_type' => User::class,
    'actor_id' => $user->id,
    'action' => 'created',
    'subject_type' => Task::class,
    'subject_id' => $task->id,
    'source' => Activity::SOURCE_MANUAL,
    'summary' => 'Task created',
    'description' => 'User created a new task',
    'occurred_at' => now(),
]);

// Activity with context (workspace-scoped)
Activity::create([
    'actor_type' => User::class,
    'actor_id' => $user->id,
    'action' => 'updated',
    'subject_type' => Task::class,
    'subject_id' => $task->id,
    'context_type' => Workspace::class,
    'context_id' => $workspace->id,
    'source' => Activity::SOURCE_SYSTEM,
    'summary' => 'Task updated',
    'occurred_at' => now(),
]);

// Activity with properties and metadata
Activity::create([
    'action' => 'login',
    'actor_type' => User::class,
    'actor_id' => $user->id,
    'source' => Activity::SOURCE_SYSTEM,
    'properties' => [
        'ip_address' => request()->ip(),
        'duration' => 3600,
    ],
    'metadata' => [
        'browser' => 'Chrome',
        'version' => '120.0',
    ],
    'occurred_at' => now(),
]);
```

### 3. Query Activities

[](#3-query-activities)

```
// Get activities for a specific user
$activities = Activity::forActor(User::class, $user->id)->get();

// Get activities for a specific task
$activities = Activity::forSubject(Task::class, $task->id)->get();

// Get activities within a workspace context
$activities = Activity::inContext(Workspace::class, $workspace->id)->get();

// Filter by action
$activities = Activity::byAction('created')->get();

// Filter by source
$activities = Activity::bySource(Activity::SOURCE_WEBHOOK)->get();

// Filter by date range
$activities = Activity::inDateRange('2024-01-01', '2024-01-31')->get();

// Chain scopes for complex queries
$activities = Activity::forActor(User::class, $user->id)
    ->forSubject(Task::class, $task->id)
    ->inContext(Workspace::class, $workspace->id)
    ->byAction('created')
    ->latest('occurred_at')
    ->get();
```

### 4. Access Model Activities

[](#4-access-model-activities)

```
// Get all activities for a task
$task->activities;

// Get the latest activity timestamp
$task->last_activity;
```

Configuration
-------------

[](#configuration)

The package provides several configuration options in `config/activities.php`:

```
return [
    // Model Configuration
    'user_model' => env('ACTIVITIES_USER_MODEL', 'App\\Models\\User'),
    'workspace_model' => env('ACTIVITIES_WORKSPACE_MODEL', 'App\\Models\\Workspace'),
    'project_model' => env('ACTIVITIES_PROJECT_MODEL', 'App\\Models\\Project'),

    // Route Configuration
    'register_routes' => env('ACTIVITIES_REGISTER_ROUTES', true),
    'route_prefix' => env('ACTIVITIES_ROUTE_PREFIX', ''),
    'route_middleware' => ['auth:sanctum'],

    // Feature Flags
    'workspace_scoped' => env('ACTIVITIES_WORKSPACE_SCOPED', true),
    'project_scoped' => env('ACTIVITIES_PROJECT_SCOPED', true),
    'allow_manual_creation' => env('ACTIVITIES_ALLOW_MANUAL', true),
    'allow_webhook_creation' => env('ACTIVITIES_ALLOW_WEBHOOK', true),
];
```

API Routes
----------

[](#api-routes)

If routes are enabled, the following endpoints are automatically registered:

### List Activities

[](#list-activities)

```
GET /api/activities
GET /api/workspaces/{workspaceId}/activities

```

**Query Parameters:**

- `projectId` - Filter by project
- `memberId` - Filter by user/member
- `from` - Filter by start date
- `to` - Filter by end date

### Create Activity

[](#create-activity)

```
POST /api/activities
POST /api/workspaces/{workspaceId}/activities

```

**Request Body:**

```
{
  "projectId": 1,
  "startTime": "2024-01-01 10:00:00",
  "summary": "Activity summary",
  "description": "Activity description"
}
```

Activity Sources
----------------

[](#activity-sources)

The package supports multiple activity sources:

```
Activity::SOURCE_MANUAL      // User-created activities
Activity::SOURCE_WEBHOOK     // Activities from webhooks
Activity::SOURCE_API         // Activities from API calls
Activity::SOURCE_SYSTEM      // System-generated activities
Activity::SOURCE_INTEGRATION // Activities from integrations
```

Check activity source:

```
$activity->isManual();
$activity->isFromWebhook();
$activity->isSystem();
```

Properties and Metadata
-----------------------

[](#properties-and-metadata)

Store flexible data with activities:

```
// Set properties
$activity->setProperty('duration', 3600);
$activity->setProperty('priority', 'high');
$activity->save();

// Get properties
$activity->getProperty('duration');
$activity->getProperty('priority', 'default_value');

// Set metadata
$activity->setMetadata(['browser' => 'Chrome', 'version' => '120.0']);
$activity->setMetadata('browser', 'Chrome');
$activity->save();

// Get metadata
$activity->getMetadata();
$activity->getMetadata('browser');
```

Testing
-------

[](#testing)

Run the test suite:

```
composer test
```

Run code style checks:

```
composer pint:test
```

Fix code style issues:

```
composer pint
```

Use Cases
---------

[](#use-cases)

- **Audit Logs**: Track all changes to important models
- **User Activity Feeds**: Show what users have been doing
- **Workspace Activity**: Track activities within workspace contexts
- **Project Timelines**: Display project-related activities
- **System Events**: Log important system events and actions
- **Integration Tracking**: Track activities from external integrations
- **Time Tracking**: Store time-related data in activity properties

Database Schema
---------------

[](#database-schema)

The activities table includes:

- **actor\_type/actor\_id**: Who performed the activity (polymorphic)
- **action**: What action was performed
- **subject\_type/subject\_id**: What entity was acted upon (polymorphic, optional)
- **context\_type/context\_id**: The scope/context (workspace, project, etc., optional)
- **source**: Where the activity originated from
- **source\_id**: External source identifier (optional)
- **summary**: Short description
- **description**: Detailed description
- **properties**: Flexible JSON data
- **metadata**: Additional JSON metadata
- **occurred\_at**: When the activity occurred
- **created\_at/updated\_at**: Record timestamps

Requirements
------------

[](#requirements)

- PHP 8.2 or higher
- Laravel 11.0 or 12.0

License
-------

[](#license)

MIT License

Credits
-------

[](#credits)

Developed by the Whilesmart Team

###  Health Score

22

—

LowBetter than 22% of packages

Maintenance58

Moderate activity, may be stable

Popularity11

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity11

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/a1ca6f6e01ecbfe6640ff410c4f0321054fb48d05a5f843c2b89887b90369bcd?d=identicon)[whilesmart](/maintainers/whilesmart)

---

Top Contributors

[![nfebe](https://avatars.githubusercontent.com/u/14317775?v=4)](https://github.com/nfebe "nfebe (4 commits)")

### Embed Badge

![Health badge](/badges/whilesmart-eloquent-activities/health.svg)

```
[![Health](https://phpackages.com/badges/whilesmart-eloquent-activities/health.svg)](https://phpackages.com/packages/whilesmart-eloquent-activities)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
