deifhelt/laravel-activity-presenter

Activity presenter for Laravel.

Fund package maintenance!
deifhelt

Installs: 6

Dependents: 0

Suggesters: 0

Security: 0

Stars: 0

Watchers: 0

Forks: 0

pkg:composer/deifhelt/laravel-activity-presenter

v1.0.0 2026-01-02 02:55 UTC

This package is auto-updated.

Last update: 2026-01-08 05:05:57 UTC


README

Latest Version on Packagist Total Downloads License

Laravel Activity Presenter is a powerful presentation layer for spatie/laravel-activitylog. It solves the common challenges of displaying activity logs in your application: resolving relationships efficiently, formatting data consistently, and handling translations.

Why use this?

When displaying activity logs, you often face these issues:

  1. N+1 Queries: Showing "User X updated Project Y" requires loading the User and Project models for every log entry.
  2. Missing Context: If "Project Y" is deleted, you still want to show its name in the log history, but the relationship is null.
  3. Unformatted Data: You have user_id: 5 in the log properties, but you want to display "John Doe".
  4. Inconsistent Presentation: You find yourself repeating trans('...')... logic in every Blade view.

This package solves all of them.

Key Features

  • 🚀 Smart Resolution: Automatically resolves related models (User, Subject) in a single optimized query to prevent N+1 issues.
  • 💎 Unified DTO: Transforms raw log data into a consistent ActivityPresentationDTO class for easy use in Views and APIs.
  • 🔌 Config-Driven: Define how specific attributes (like category_id) map to models in a simple config file.
  • 🌍 Auto-Localization: Built-in support for translating events (created -> Creado), model names (User -> Usuario), and attributes.
  • 🛡️ Graceful Fallbacks: If a related model is permanently deleted, it gracefully falls back to historical data (e.g., "Project #123").

Installation

Install via Composer (Spatie Activitylog is included automatically):

composer require deifhelt/laravel-activity-presenter

Publish the configuration:

php artisan vendor:publish --provider="Deifhelt\ActivityPresenter\ActivityPresenterServiceProvider"

Quick Usage

1. In your Controller

use Deifhelt\ActivityPresenter\Facades\ActivityPresenter;
use Spatie\Activitylog\Models\Activity;

public function index()
{
    // Fetch logs (paginated)
    $activities = Activity::latest()->paginate(20);

    // Present them (loads relations, formats dates, translates events)
    $presented = ActivityPresenter::presentCollection($activities);

    return view('activities.index', [
        'activities' => $presented
    ]);
}

2. In your Blade View

@foreach($activities as $activity)
    <div class="activity-item">
        <span class="date">{{ $activity->diff }}</span>

        <!-- "John Doe created Project Alpha" -->
        <p>
            <strong>{{ $activity->user_name }}</strong>
            {{ $activity->event }}
            <strong>{{ $activity->subject_name }}</strong>
        </p>

        <!-- Show changes: "Status: Pending -> Active" -->
        <ul>
            @foreach($activity->new_values as $key => $value)
                <li>
                     {{ $key }}:
                     <span class="text-red-500">{{ $activity->old_values[$key] ?? 'N/A' }}</span>
                     &rarr;
                     <span class="text-green-500">{{ $value }}</span>
                </li>
            @endforeach
        </ul>
    </div>
@endforeach

Documentation

License

The MIT License (MIT). Please see License File for more information.