PHPackages                             lyrasoft/action-log - 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. [Logging &amp; Monitoring](/categories/logging)
4. /
5. lyrasoft/action-log

ActiveWindwalker-package[Logging &amp; Monitoring](/categories/logging)

lyrasoft/action-log
===================

LYRASOFT Action Log Package

1.1.1(3mo ago)01.6k3MITPHPPHP &gt;=8.4.6

Since Dec 15Pushed 3mo ago1 watchersCompare

[ Source](https://github.com/lyrasoft/luna-action-log)[ Packagist](https://packagist.org/packages/lyrasoft/action-log)[ RSS](/packages/lyrasoft-action-log/feed)WikiDiscussions master Synced today

READMEChangelogDependencies (6)Versions (7)Used By (0)

LYRASOFT Action Log Package
===========================

[](#lyrasoft-action-log-package)

[![Action Log](https://private-user-images.githubusercontent.com/1639206/290746690-8b24f4f0-ba2f-4010-877c-161b3ad66275.jpg?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODI4NTI4NTYsIm5iZiI6MTc4Mjg1MjU1NiwicGF0aCI6Ii8xNjM5MjA2LzI5MDc0NjY5MC04YjI0ZjRmMC1iYTJmLTQwMTAtODc3Yy0xNjFiM2FkNjYyNzUuanBnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYzMCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MzBUMjA0OTE2WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MGYzYjlkMGQzYWY5NTk3YjliNDk0NDI4NDRlZTY4MDcyZDRjNWJiMTI1ZDc0YTQzMTExOWYyMDI1MzViZGQzMCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGanBlZyJ9.SgnY2W7Yt09sO27ymbQk1EjdlHXykeaIHVNp-Wbhr1M)](https://private-user-images.githubusercontent.com/1639206/290746690-8b24f4f0-ba2f-4010-877c-161b3ad66275.jpg?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODI4NTI4NTYsIm5iZiI6MTc4Mjg1MjU1NiwicGF0aCI6Ii8xNjM5MjA2LzI5MDc0NjY5MC04YjI0ZjRmMC1iYTJmLTQwMTAtODc3Yy0xNjFiM2FkNjYyNzUuanBnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYzMCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MzBUMjA0OTE2WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MGYzYjlkMGQzYWY5NTk3YjliNDk0NDI4NDRlZTY4MDcyZDRjNWJiMTI1ZDc0YTQzMTExOWYyMDI1MzViZGQzMCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGanBlZyJ9.SgnY2W7Yt09sO27ymbQk1EjdlHXykeaIHVNp-Wbhr1M)

- [LYRASOFT Action Log Package](#lyrasoft-action-log-package)
    - [Installation](#installation)
    - [Register Admin Menu](#register-admin-menu)
    - [Getting Started](#getting-started)
        - [Auto Clear](#auto-clear)
    - [Configure Middleware](#configure-middleware)
        - [Prepare Log Handler](#prepare-log-handler)
    - [Manually Log](#manually-log)
    - [Hide Sensitive Data](#hide-sensitive-data)
    - [View](#view)
        - [Pagination](#pagination)
        - [Limit Per-Page](#limit-per-page)
        - [Custom Task (Action) and Entity Display](#custom-task-action-and-entity-display)

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

[](#installation)

Install from composer

```
composer require lyrasoft/action-log
```

Then copy files to project

```
php windwalker pkg:install lyrasoft/action-log -t routes -t migrations
```

And run migrations.

Next, add Middleware to `routes/admin.route.php`

```
use Lyrasoft\ActionLog\Middleware\ActionLogMiddleware;

// ...

$router->group('admin')
    // ...
    ->middleware(ActionLogMiddleware::class)
    // ...
```

> If you want to log front and admin, you may put middleware to `main.route.php`

Languages

Add this line to admin &amp; front middleware to load language from package automatically:

```
use Lyrasoft\ActionLog\ActionLogPackage;

// ...

    $this->lang->loadAllFromVendor(ActionLogPackage::class, 'ini');
```

If you want to copy language file to project, run this:

```
php windwalker pkg:install lyrasoft/action-log -t lang
```

Register Admin Menu
-------------------

[](#register-admin-menu)

Edit `resources/menu/admin/sidemenu.menu.php`

```
// Action Log
$menu->link('操作記錄')
    ->to($nav->to('action_log_list'))
    ->icon('fal fa-shoe-prints');
```

Getting Started
---------------

[](#getting-started)

If you have setup ActionLog package, now try to save any item or filter any list, you can see a new log shows on `action_logs` table:

[![log](https://private-user-images.githubusercontent.com/1639206/290747730-1f007d14-82dd-4034-93b3-cb828f2a9fe7.jpg?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODI4NTI4NTYsIm5iZiI6MTc4Mjg1MjU1NiwicGF0aCI6Ii8xNjM5MjA2LzI5MDc0NzczMC0xZjAwN2QxNC04MmRkLTQwMzQtOTNiMy1jYjgyOGYyYTlmZTcuanBnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYzMCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MzBUMjA0OTE2WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MWEzYTM0YzNkZjcwYmNiMzdlNDFkZjVmMmMwNGZhYzY4YWIzNzdhZjdhMDQ0MGY3YmIzNGExODdmN2RlZmIyOSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGanBlZyJ9.Z5wo3Wfx00qPNsEg1bCFiPfZdmUFLH6o-28QUsujjnA)](https://private-user-images.githubusercontent.com/1639206/290747730-1f007d14-82dd-4034-93b3-cb828f2a9fe7.jpg?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODI4NTI4NTYsIm5iZiI6MTc4Mjg1MjU1NiwicGF0aCI6Ii8xNjM5MjA2LzI5MDc0NzczMC0xZjAwN2QxNC04MmRkLTQwMzQtOTNiMy1jYjgyOGYyYTlmZTcuanBnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYzMCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MzBUMjA0OTE2WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MWEzYTM0YzNkZjcwYmNiMzdlNDFkZjVmMmMwNGZhYzY4YWIzNzdhZjdhMDQ0MGY3YmIzNGExODdmN2RlZmIyOSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGanBlZyJ9.Z5wo3Wfx00qPNsEg1bCFiPfZdmUFLH6o-28QUsujjnA)

### Auto Clear

[](#auto-clear)

Bt default, ActionLog only reserve last 3 months logs. It has 1/100 chance to trigger clear action.

You can configure the reserve time and clear chance at config file or using env to configure them:

```
return [
    'action_log' => [
        'reserve_max_time' => env('ACTION_LOG_MAX_TIME') ?: '3months',
        'auth_clear' => [
            'chance' => env('ACTION_LOG_CLEAR_CHANCE', 1),
            'chance_base' => env('ACTION_LOG_CLEAR_CHANCE_BASE', 100)
        ],

        // ...
    ]
];
```

Configure Middleware
--------------------

[](#configure-middleware)

Add options to middleware:

```
$router->group('admin')
    // ...
    ->middleware(
        ActionLogMiddleware::class,
        methods: ['POST', 'DELETE'],
        enabled: (bool) env('ACTION_LOG_ENABLE'),
        maxTime: '7days',
        // ...
    )
    // ...
```

Config NameTypeDefaultDescription`methods`array, string, null`['POST', 'PUT', 'PATCH', 'DELETE']`Allowed method, use NULL to allow all`enabled`bool`true`Enabled log, you may add your env to configure this.`max_time`string, null`null`Max reserve time, default using config and env, can be datetime string.`clear_chance`int, null`null`Auto clear chance, default using config and env.`clear_chance_base`int, null`null`Auto clear chance base, default using config and env.`prepare_log`callable, null`null`The handler to handle log item, can be callable or closure, can inject services.### Prepare Log Handler

[](#prepare-log-handler)

Add a custom handler to configure every log, must use `$log` argument to inject log item.

This is an example to override user name.

```
use Lyrasoft\ActionLog\Entity\ActionLog;
use Lyrasoft\Luna\User\UserService;

$router->group('admin')
    // ...
    ->middleware(
        ActionLogMiddleware::class,
        options: [
            'prepare_log' => function (ActionLog $log, UserService $userService) {
                $user = $userService->getUser();

                $log->name = $user->firstName . ' ' . $user->lastName;
            }
        ]
    )
    // ...
```

If you want to ignore some actions, just return FALSE in prepare log handler:

```
    'prepare_log' => function (ActionLog $log, UserService $userService) {
        // ...

        if ($log->getTask() === '...') {
            // This log will not save
            return false;
        }
    }
```

Manually Log
------------

[](#manually-log)

Just inject `ActionLogService` to do this.

```
/** @var \Lyrasoft\ActionLog\Service\ActionLogService $actionLogService */
$actionLogService = $app->retrieve(\Lyrasoft\ActionLog\Service\ActionLogService::class);
$appRequest = $app->retrieve(\Windwalker\Core\Http\AppRequest::class);

$actionLogService->clearExpiredIfTriggered();

$actionLogService->log($appRequest, $response ?? null);

// Or just create entity item.
$log = $actionLogService->createLogItem($appRequest, $response ?? null);
```

Hide Sensitive Data
-------------------

[](#hide-sensitive-data)

Add this to config file to hide some sensitive data from log:

```
// ...

    'hidden_list' => [
        'body' => [
            'password',
            'secret',
            // Add more fields...
        ],
    ]
```

View
----

[](#view)

### Pagination

[](#pagination)

By default, ActionLog will display total pages:

[![Image](https://private-user-images.githubusercontent.com/1639206/510700138-94904489-d15a-4b1c-b23c-5cdd4fd16a47.jpg?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODI4NTI4NTYsIm5iZiI6MTc4Mjg1MjU1NiwicGF0aCI6Ii8xNjM5MjA2LzUxMDcwMDEzOC05NDkwNDQ4OS1kMTVhLTRiMWMtYjIzYy01Y2RkNGZkMTZhNDcuanBnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYzMCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MzBUMjA0OTE2WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MTJjOTc4MWNmODA3NDk3ZWRiMDI0NmEyOWY1Yjc4YjQ0ODc3YmJmNzJiMmRjMjA0ZjhmY2NhMmI1N2FiNzE5YyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGanBlZyJ9.OKY3wjytcUb7Dz5BTM_zUaQKgS0qOwVNktdeLKjigm0)](https://private-user-images.githubusercontent.com/1639206/510700138-94904489-d15a-4b1c-b23c-5cdd4fd16a47.jpg?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODI4NTI4NTYsIm5iZiI6MTc4Mjg1MjU1NiwicGF0aCI6Ii8xNjM5MjA2LzUxMDcwMDEzOC05NDkwNDQ4OS1kMTVhLTRiMWMtYjIzYy01Y2RkNGZkMTZhNDcuanBnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYzMCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MzBUMjA0OTE2WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MTJjOTc4MWNmODA3NDk3ZWRiMDI0NmEyOWY1Yjc4YjQ0ODc3YmJmNzJiMmRjMjA0ZjhmY2NhMmI1N2FiNzE5YyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGanBlZyJ9.OKY3wjytcUb7Dz5BTM_zUaQKgS0qOwVNktdeLKjigm0)

However, if you have a large number of logs, counting total rows may impact performance. You can disable total count by setting `ACTION_LOG_COUNT_PAGES=0`in the `.env` or `.env.base` files.

This will display a simple pagination without total pages:

[![Image](https://private-user-images.githubusercontent.com/1639206/510701108-cfa234f3-9692-4545-b3bf-c1235a2a0705.jpg?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODI4NTI4NTYsIm5iZiI6MTc4Mjg1MjU1NiwicGF0aCI6Ii8xNjM5MjA2LzUxMDcwMTEwOC1jZmEyMzRmMy05NjkyLTQ1NDUtYjNiZi1jMTIzNWEyYTA3MDUuanBnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYzMCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MzBUMjA0OTE2WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZGQxNTFiNjM5OTQ2YTc2ZGU5M2IxNDY5N2ZhZDE1ZDY2NGRhNGJmY2VlZjdkMzdhZDkzM2M1MTkxYjA3YzczOCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGanBlZyJ9.7FZnId1JNkf3L0oLv4Su7ZASDsSadJAWoQ2lctCBdcQ)](https://private-user-images.githubusercontent.com/1639206/510701108-cfa234f3-9692-4545-b3bf-c1235a2a0705.jpg?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODI4NTI4NTYsIm5iZiI6MTc4Mjg1MjU1NiwicGF0aCI6Ii8xNjM5MjA2LzUxMDcwMTEwOC1jZmEyMzRmMy05NjkyLTQ1NDUtYjNiZi1jMTIzNWEyYTA3MDUuanBnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYzMCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MzBUMjA0OTE2WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZGQxNTFiNjM5OTQ2YTc2ZGU5M2IxNDY5N2ZhZDE1ZDY2NGRhNGJmY2VlZjdkMzdhZDkzM2M1MTkxYjA3YzczOCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGanBlZyJ9.7FZnId1JNkf3L0oLv4Su7ZASDsSadJAWoQ2lctCBdcQ)

### Limit Per-Page

[](#limit-per-page)

Use `ACTION_LOG_DISPLAY_LIMIT=xx` in `.env` or `.env.base` to configure the number of items displayed per page. Default is `100`.

### Custom Task (Action) and Entity Display

[](#custom-task-action-and-entity-display)

By default, the admin list table shows task and entity by english programaticlly name.

You can custom the render name by events. Create a subscriber:

```
namespace App\Subscriber;

use Lyrasoft\ActionLog\Event\FormatEntityEvent;
use Lyrasoft\ActionLog\Event\FormatTaskEvent;
use Windwalker\Event\Attributes\EventSubscriber;
use Windwalker\Event\Attributes\ListenTo;

#[EventSubscriber]
class ActionLogSubscriber
{
    #[ListenTo(FormatTaskEvent::class)]
    public function formatTask(FormatTaskEvent $event): void
    {
        $log = $event->log;
        $task = $log->task;

        // Custom you task text

        // Same examples
        if ($task === 'relativeContracts') {
            $event->taskText = '相關合約操作';
        }

        if ($task === 'relativeRentals') {
            $event->taskText = '相關委託操作';
        }

        if ($task === 'addToCart') {
            $event->taskText = '加入購物車';
        }
    }

    #[ListenTo(FormatEntityEvent::class)]
    public function formatEntity(FormatEntityEvent $event): void
    {
        $log = $event->getLog();

        // Custom you entity text
        $event->entityText = '...';
    }
}
```

Register this subscriber to `etc/app/main.config.php`:

```
// ...

        'listeners' => [
            \Lyrasoft\ActionLog\Service\ActionLogService::class => [
                \App\Subscriber\ActionLogSubscriber::class
            ]
        ],
```

The text you return from event will show at table list:

[![tasks](https://private-user-images.githubusercontent.com/1639206/290753925-6c47f458-9432-4336-89bd-61ad3e776bf0.jpg?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODI4NTI4NTYsIm5iZiI6MTc4Mjg1MjU1NiwicGF0aCI6Ii8xNjM5MjA2LzI5MDc1MzkyNS02YzQ3ZjQ1OC05NDMyLTQzMzYtODliZC02MWFkM2U3NzZiZjAuanBnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYzMCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MzBUMjA0OTE2WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZDRjMWRjZTkyYzc1NThjZWVkY2I5NTk3M2JmNjdjN2QwNzUxZTFjMDdjYzUyNDNmOTk0YzQyZmVjNGRiMGI3MyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGanBlZyJ9.eRtzqdevAWUIBhwlXXpg7cpOripdbkiN8q28LVc7Z4k)](https://private-user-images.githubusercontent.com/1639206/290753925-6c47f458-9432-4336-89bd-61ad3e776bf0.jpg?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODI4NTI4NTYsIm5iZiI6MTc4Mjg1MjU1NiwicGF0aCI6Ii8xNjM5MjA2LzI5MDc1MzkyNS02YzQ3ZjQ1OC05NDMyLTQzMzYtODliZC02MWFkM2U3NzZiZjAuanBnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDYzMCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjA2MzBUMjA0OTE2WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZDRjMWRjZTkyYzc1NThjZWVkY2I5NTk3M2JmNjdjN2QwNzUxZTFjMDdjYzUyNDNmOTk0YzQyZmVjNGRiMGI3MyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmcmVzcG9uc2UtY29udGVudC10eXBlPWltYWdlJTJGanBlZyJ9.eRtzqdevAWUIBhwlXXpg7cpOripdbkiN8q28LVc7Z4k)

###  Health Score

47

—

FairBetter than 93% of packages

Maintenance79

Regular maintenance activity

Popularity21

Limited adoption so far

Community14

Small or concentrated contributor base

Maturity64

Established project with proven stability

 Bus Factor1

Top contributor holds 62.5% 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.

###  Release Activity

Cadence

Every ~163 days

Recently: every ~204 days

Total

6

Last Release

112d ago

PHP version history (2 changes)1.0.0PHP &gt;=8.2

1.1.0PHP &gt;=8.4.6

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/1639206?v=4)[Simon Asika](/maintainers/asika32764)[@asika32764](https://github.com/asika32764)

---

Top Contributors

[![asika32764](https://avatars.githubusercontent.com/u/1639206?v=4)](https://github.com/asika32764 "asika32764 (20 commits)")[![lerbusi](https://avatars.githubusercontent.com/u/108831232?v=4)](https://github.com/lerbusi "lerbusi (10 commits)")[![chokeslam](https://avatars.githubusercontent.com/u/34531644?v=4)](https://github.com/chokeslam "chokeslam (1 commits)")[![yinminc](https://avatars.githubusercontent.com/u/28665511?v=4)](https://github.com/yinminc "yinminc (1 commits)")

### Embed Badge

![Health badge](/badges/lyrasoft-action-log/health.svg)

```
[![Health](https://phpackages.com/badges/lyrasoft-action-log/health.svg)](https://phpackages.com/packages/lyrasoft-action-log)
```

###  Alternatives

[rap2hpoutre/fast-excel

Fast Excel import/export for Laravel

2.3k27.0M52](/packages/rap2hpoutre-fast-excel)[unopim/unopim

UnoPim Laravel PIM

10.5k2.4k](/packages/unopim-unopim)[kimai/kimai

Kimai - Time Tracking

4.8k9.0k1](/packages/kimai-kimai)[flow-php/flow

PHP ETL - Extract Transform Load - Data processing framework

85036.3k](/packages/flow-php-flow)[laravel-enso/tables

Server-side data tables and export backend for Laravel Enso

63355.1k83](/packages/laravel-enso-tables)[jlevers/selling-partner-api

PHP client for Amazon's Selling Partner API

4335.4M2](/packages/jlevers-selling-partner-api)

PHPackages © 2026

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