Customizing actions | laravel-activitylog | Spatie

 SPATIE

  Laravel Activity Log
=======================

spatie.be/open-source

  [Docs](https://spatie.be/docs)  [Laravel-activitylog](https://spatie.be/docs/laravel-activitylog/v5)  Advanced-usage  Customizing actions

 Version   v5   v4   v3   v2   v1

 Other versions for crawler [v5](https://spatie.be/docs/laravel-activitylog/v5) [v4](https://spatie.be/docs/laravel-activitylog/v4) [v3](https://spatie.be/docs/laravel-activitylog/v3) [v2](https://spatie.be/docs/laravel-activitylog/v2) [v1](https://spatie.be/docs/laravel-activitylog/v1)

  Customizing actions
- [ Introduction ](https://spatie.be/docs/laravel-activitylog/v5/introduction)
- [ Support us ](https://spatie.be/docs/laravel-activitylog/v5/support-us)
- [ Requirements ](https://spatie.be/docs/laravel-activitylog/v5/requirements)
- [ Installation and Setup ](https://spatie.be/docs/laravel-activitylog/v5/installation-and-setup)
- [ Questions and issues ](https://spatie.be/docs/laravel-activitylog/v5/questions-and-issues)
- [ Changelog ](https://spatie.be/docs/laravel-activitylog/v5/changelog)
- [ Upgrading ](https://spatie.be/docs/laravel-activitylog/v5/upgrading)
- [ About us ](https://spatie.be/docs/laravel-activitylog/v5/about-us)

Basic usage
-----------

- [ Logging activity ](https://spatie.be/docs/laravel-activitylog/v5/basic-usage/logging-activity)
- [ Cleaning up the log ](https://spatie.be/docs/laravel-activitylog/v5/basic-usage/cleaning-up-the-log)

Advanced usage
--------------

- [ Logging model events ](https://spatie.be/docs/laravel-activitylog/v5/advanced-usage/logging-model-events)
- [ Define causer for runtime ](https://spatie.be/docs/laravel-activitylog/v5/advanced-usage/define-causer-for-runtime)
- [ Using placeholders ](https://spatie.be/docs/laravel-activitylog/v5/advanced-usage/using-placeholders)
- [ Using multiple logs ](https://spatie.be/docs/laravel-activitylog/v5/advanced-usage/using-multiple-logs)
- [ Disabling logging ](https://spatie.be/docs/laravel-activitylog/v5/advanced-usage/disabling-logging)
- [ Customizing actions ](https://spatie.be/docs/laravel-activitylog/v5/advanced-usage/customizing-actions)
- [ Before logging hook ](https://spatie.be/docs/laravel-activitylog/v5/advanced-usage/before-logging-hook)
- [ Buffering activities ](https://spatie.be/docs/laravel-activitylog/v5/advanced-usage/buffering)
- [ Log Options ](https://spatie.be/docs/laravel-activitylog/v5/advanced-usage/log-options)
- [ Causer Resolver ](https://spatie.be/docs/laravel-activitylog/v5/advanced-usage/causer-resolver)

 Customizing actions
===================

###  On this page

1. [ Available actions ](#content-available-actions)
2. [ Overriding an action ](#content-overriding-an-action)
3. [ Manipulating changes ](#content-manipulating-changes)
4. [ Overridable methods ](#content-overridable-methods)

The package uses action classes for its core operations. You can extend these to customize behavior.

Available actions
-----------------------------------------------------------------------------------------------------------

### LogActivityAction

Called every time an activity is logged. Handles description placeholder replacement, transforming changes, calling `beforeActivityLogged()` on the subject, and saving the activity to the database.

### CleanActivityLogAction

Called by the `activitylog:clean` command. Handles deleting old activity records.

Overriding an action
--------------------------------------------------------------------------------------------------------------------

Create a class that extends the original action and override the protected methods you want to customize:

```
use Illuminate\Database\Eloquent\Model;
use Spatie\Activitylog\Actions\LogActivityAction;

class CustomLogActivityAction extends LogActivityAction
{
    protected function save(Model $activity): void
    {
        // Example: dispatch to queue instead of saving synchronously
        dispatch(fn () => $activity->save());
    }
}
```

Then register it in the config:

```
// config/activitylog.php
'actions' => [
    'log_activity' => \App\Actions\CustomLogActivityAction::class,
    'clean_log' => \Spatie\Activitylog\Actions\CleanActivityLogAction::class,
],
```

Manipulating changes
--------------------------------------------------------------------------------------------------------------------

To modify the changes array before it's saved (e.g. removing sensitive fields), override `transformChanges()`:

```
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Arr;
use Spatie\Activitylog\Actions\LogActivityAction;

class RedactPasswordAction extends LogActivityAction
{
    protected function transformChanges(Model $activity): void
    {
        $changes = $activity->attribute_changes?->toArray() ?? [];

        Arr::forget($changes, ['attributes.password', 'old.password']);

        $activity->attribute_changes = collect($changes);
    }
}
```

Overridable methods
-----------------------------------------------------------------------------------------------------------------

### LogActivityAction

MethodDescription`resolveDescription($activity, $description)`Resolves placeholders like `:subject.name` in the description`transformChanges($activity)`Modify the changes array before saving (default: no-op)`beforeActivityLogged($activity)`Calls `beforeActivityLogged()` on the subject model if it exists`save($activity)`Saves the activity to the database`replacePlaceholders($description, $activity)`Performs the actual placeholder replacement### CleanActivityLogAction

MethodDescription`getCutOffDate($maxAgeInDays)`Calculates the date before which records should be deleted`deleteOldActivities($cutOffDate, $logName)`Performs the actual deletion query

 A good
match?
-------------

### What we do best

- All things Laravel
- Custom frontend components
- Building APIs
- AI-powered features
- Simplifying things
- Clean solutions
- Integrating services

### Not our cup of tea

- WordPress themes
- Cutting corners
- Free mockups to win a job
- "Just execute the briefing"

 In short: we'd like to be a **substantial part** of your project.

 [ Get in touch via email ](mailto:info@spatie.be?subject=A%20good%20match%21&body=Tell%20us%20as%20much%20as%20you%20can%20about%0A-%20your%20online%20project%0A-%20your%20planning%0A-%20your%20budget%0A-%20%E2%80%A6%0A%0AAnything%20that%20helps%20us%20to%20start%20straightforward%21)
