PHPackages                             illusiard/yii2-mass-event-layer - 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. [Utility &amp; Helpers](/categories/utility)
4. /
5. illusiard/yii2-mass-event-layer

ActiveYii2-extension[Utility &amp; Helpers](/categories/utility)

illusiard/yii2-mass-event-layer
===============================

Zero-config mass event layer for Yii2: intercepts bulk DB operations and emits unified events (sync/async-ready) with nested transaction safety.

v0.2.0(4w ago)061MITPHPPHP &gt;=8.5

Since Feb 10Pushed 4w agoCompare

[ Source](https://github.com/Illusiard/yii2-mass-event-layer)[ Packagist](https://packagist.org/packages/illusiard/yii2-mass-event-layer)[ RSS](/packages/illusiard-yii2-mass-event-layer/feed)WikiDiscussions master Synced today

READMEChangelogDependencies (13)Versions (6)Used By (1)

illusiard/yii2-mass-event-layer
===============================

[](#illusiardyii2-mass-event-layer)

Инфраструктурный слой **нулевой конфигурации** для Yii2, который фиксирует **массовые операции с БД** (`updateAll`, `deleteAll`, `batchInsert`) и публикует их как события Yii.

Слой **учитывает транзакции**, включая **вложенные транзакции** (точки сохранения), и не содержит бизнес-логики.

Functions
---------

[](#functions)

- **Нулевая конфигурация**: начинает работать сразу после `composer require`
- Захватывает массовые операции с БД через расширенный `yii\db\Command`:
    - `db.updateAll`, `db.deleteAll`, `db.insert`, `db.batchInsert`
    - Резервное событие: `db.execute` (когда структурированный контекст недоступен)
- **Поддержка вложенных транзакций** через исправленный `yii\db\Transaction`
    - публиковать события только при **внешней фиксации** (при коммите реальной транзакции)
    - корректно сбрасывать события при внутреннем/внешнем откате (отмене точки сохранения или реальной транзакции)
- **Единый контракт**: все события публикуются с единой схемой данных.
- **Внутри нет бизнес-логики**.

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

[](#installation)

Требуется PHP 8.5 или новее.

```
composer require illusiard/yii2-mass-event-layer
```

По умолчанию расширение подключается автоматически через `yiisoft/yii2-composer` (он генерирует `vendor/yiisoft/extensions.php`).

Если это не так:

1. Убедитесь, что компонент приложения «massEvents» существует.
2. Если ваше приложение не загружает `vendor/yiisoft/extensions.php`, включите его в своей конфигурации (стандартные приложения Yii2 уже загружают).

В конфигурации приложения:

```
'components' => [
    'db' => [
        'class' => illusiard\massEvents\components\db\Connection::class,
        'dsn' => 'mysql:host=localhost;dbname=app',
        'username' => 'user',
        'password' => 'secret',
        'charset' => 'utf8',
    ],
],
```

Все остальные параметры соединения полностью совместимы с yii\\db\\Connection и передаются без изменений.

Usages
------

[](#usages)

Подпишитесь на события, используя события Yii:

```
use yii\base\Event;
use illusiard\massEvents\components\MassEventLayer;

Event::on(MassEventLayer::class, 'db.updateAll', function ($e) {
    /** @var \illusiard\massEvents\components\MassEventYiiEvent $e */
    $payload = $e->payload;

    // $payload example:
    // [
    //   'name' => 'db.updateAll',
    //   'occurredAt' => 1700000000,
    //   'payload' => [
    //     'db' => 'mysql:host=...;dbname=...',
    //     'table' => 'employee',
    //     'operation' => 'updateAll',
    //     'affectedRows' => 42,
    //     'set' => ['status' => 'archived'],
    //     'condition' => ['department_id' => 10],
    //     'params' => [],
    //   ],
    //   'meta' => ['captured' => true],
    // ]
});
```

Вы также можете подписаться на всеобщее событие (т.е. на все события):

```
Event::on(MassEventLayer::class, MassEventLayer::EVENT_ANY, function ($e) {
    /** @var \illusiard\massEvents\components\MassEventYiiEvent $e */
    // handle any mass event
});
```

Events
------

[](#events)

- `db.updateAll`
- `db.deleteAll`
- `db.insert`
- `db.batchInsert`
- `db.execute` (резервный вариант, когда контекст команды невозможно получить)

Transactions and nested transactions
------------------------------------

[](#transactions-and-nested-transactions)

Уровень **учитывает транзакции** и корректно поддерживает вложенные транзакции (точки сохранения):

СценарийРезультатВнутренняя `commit()` (освободить точку сохранения)события **буферизуются** и объединяются на родительском уровнеВнутренний `rollback()` (откат к точке сохранения)события текущего уровня **отбрасываются**Внешний `commit()` (настоящий COMMIT)**все буферизованные** события публикуютсяВнешний `rollback()`**все буферизованные** события отбрасываются### Техническое примечание

[](#техническое-примечание)

Функционал реализуется через кастомное соединение с БД (`illusiard\massEvents\components\db\Connection`), которое:

- возвращает расширенный `Command` для перехвата массовых операций;
- использует расширенный `Transaction` для корректной работы с вложенными транзакциями;
- не изменяет публичный контракт `yii\db\Connection`.

`Command` сохраняет контекст операции (table/set/condition и т.д.) перед `execute()` и создает событие *после* `execute()` с `affectedRows`. Если транзакция активна, события буферизуются и освобождаются при внешней фиксации.

### Известное ограничение (так задумано)

[](#известное-ограничение-так-задумано)

Транзакции, выполняемые **вне** `yii\db\Connection` / `yii\db\Transaction` (например, кастомные адаптеры PDO `BEGIN/COMMIT`), не отслеживаются. Это намеренное ограничение: обычно Yii2-проекты используют API транзакций фреймворка. Для таких случаев предлагаю вам реализовать своё подключение.

Асинхронный паблишер через yii2-queue
-------------------------------------

[](#асинхронный-паблишер-через-yii2-queue)

Если в вашем приложении есть компонент очереди, который является экземпляром `yii\queue\Queue`, слой автоматически переключается в **асинхронный режим**:

- событие сериализуется в JSON
- пушатся через `PublishEventJob`
- джоба восстанавливает событие и публикует его через `MassEventLayer`

Filters (добавляемые)
---------------------

[](#filters-добавляемые)

Встроенные инфраструктурные фильтры:

- `IgnoreTablesFilter` — игнорировать `payload.table`
- `IgnoreSqlPatternsFilter` — игнорировать SQL по регулярному выражению (полезно для `db.execute`)
- `SamplingFilter` — детерминированная выборка по `event.id`

Пример:

```
use illusiard\massEvents\components\filters\IgnoreTablesFilter;
use illusiard\massEvents\components\filters\IgnoreSqlPatternsFilter;
use illusiard\massEvents\components\filters\SamplingFilter;

Yii::$app->massEvents->setFilters([
    new IgnoreTablesFilter(['migration', 'cache']),
    new IgnoreSqlPatternsFilter(['/^\s*SELECT\b/i']),
    new SamplingFilter(0.25),
]);
```

### IgnoreTablesFilter

[](#ignoretablesfilter)

`IgnoreTablesFilter` поддерживает:

- exact: `employee`
- wildcard: `log_*`, `*_tmp`, `user_??`
- regex (preg): `/^audit_.+$/i`

Режимы:

- по умолчанию **exclude**: игнорировать указанные/совпадающие таблицы
- **only**: публиковать только указанные/совпадающие таблицы

Примеры:

```
use illusiard\massEvents\components\filters\IgnoreTablesFilter;

Yii::$app->massEvents->addFilter(new IgnoreTablesFilter(['except' => ['migration', 'cache', 'log_*']]));
Yii::$app->massEvents->addFilter(new IgnoreTablesFilter(['only' => ['employee', 'department']]));
```

### IgnoreSqlPatternsFilter

[](#ignoresqlpatternsfilter)

`IgnoreSqlPatternsFilter` поддерживает:

- exact: `employee`
- wildcard: `log_*`, `*_tmp`, `user_??`
- regex (preg): `/^\s*SELECT\b/i`

Режимы:

- по умолчанию **exclude**: игнорировать указанные/совпадающие SQL-запросы
- **only**: публиковать только указанные/совпадающие SQL-запросы

Примеры:

```
use illusiard\massEvents\components\filters\IgnoreSqlPatternsFilter;

Yii::$app->massEvents->addFilter(new IgnoreSqlPatternsFilter(['except' => ['/^\s*SELECT\b/i']]));
Yii::$app->massEvents->addFilter(new IgnoreSqlPatternsFilter(['only' => ['/^\s*UPDATE\b/i']]));
```

Сериализация
------------

[](#сериализация)

Сериализатор по умолчанию: `illusiard\massEvents\services\VersionedJsonSerializer`.

```
Yii::$app->massEvents->setSerializer(new MySerializer());
```

### Обратная совместимость

[](#обратная-совместимость)

Если полезные данные джобы не являются контейнером (нет `schemaVersion`/`event`), они обрабатываются как **v0** (необработанный массив событий) и нормализуются. Старые версии схемы могут быть преобразованы в текущую версию внутри VersionedJsonSerializer.

Версионный контейнер (полезная нагрузка очереди с обратной совместимостью)
--------------------------------------------------------------------------

[](#версионный-контейнер-полезная-нагрузка-очереди-с-обратной-совместимостью)

При публикации в очереди события сериализуются с использованием **версированного контейнера**.

- Текущая схема: `illusiard.mass-events`
- Текущая версия: `schemaVersion`: `1`

Пример контейнера (v1):

```
{
  "schema": "illusiard.mass-events",
  "schemaVersion": 1,
  "id": "envelope-id",
  "sentAt": 1700000001,
  "event": {
    "id": "event-id",
    "name": "db.updateAll",
    "occurredAt": 1700000000,
    "payload": { "table": "employee", "affectedRows": 42 },
    "meta": { "captured": true }
  }
}
```

License
-------

[](#license)

MIT

###  Health Score

40

—

FairBetter than 86% of packages

Maintenance94

Actively maintained with recent releases

Popularity5

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity46

Maturing project, gaining track record

 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.

###  Release Activity

Cadence

Every ~41 days

Total

5

Last Release

28d ago

PHP version history (2 changes)v1.0.0PHP &gt;=8.1

v0.2.0PHP &gt;=8.5

### Community

Maintainers

![](https://www.gravatar.com/avatar/514a2bdbd1dfc61512460d4026da34187fb5e20e69be3ada0a8594b593dd269a?d=identicon)[Illusiard](/maintainers/Illusiard)

---

Top Contributors

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

---

Tags

eventsAudityii2transactionbulkmass-operationssavepoint

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/illusiard-yii2-mass-event-layer/health.svg)

```
[![Health](https://phpackages.com/badges/illusiard-yii2-mass-event-layer/health.svg)](https://phpackages.com/packages/illusiard-yii2-mass-event-layer)
```

###  Alternatives

[craftcms/cms

Craft CMS

3.6k3.6M3.1k](/packages/craftcms-cms)[asinfotrack/yii2-audittrail

Yii2-audittrail is a behavior and a set of widgets to track all modifications performed on a model

1727.5k](/packages/asinfotrack-yii2-audittrail)[akiraz2/yii2-ticket-support

Yii2 Support Ticket Module, easy, flexible, fast

601.7k](/packages/akiraz2-yii2-ticket-support)

PHPackages © 2026

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