Download the PHP package illusiard/yii2-mass-event-layer without Composer
On this page you can find all versions of the php package illusiard/yii2-mass-event-layer. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download illusiard/yii2-mass-event-layer
More information about illusiard/yii2-mass-event-layer
Files in illusiard/yii2-mass-event-layer
Package yii2-mass-event-layer
Short Description Zero-config mass event layer for Yii2: intercepts bulk DB operations and emits unified events (sync/async-ready) with nested transaction safety.
License MIT
Informations about the package yii2-mass-event-layer
illusiard/yii2-mass-event-layer
Инфраструктурный слой нулевой конфигурации для Yii2, который фиксирует массовые операции с БД (updateAll, deleteAll, batchInsert) и публикует их как события Yii.
Слой учитывает транзакции, включая вложенные транзакции (точки сохранения), и не содержит бизнес-логики.
Functions
- Нулевая конфигурация: начинает работать сразу после
composer require - Захватывает массовые операции с БД через расширенный
yii\db\Command:db.updateAll,db.deleteAll,db.insert,db.batchInsert- Резервное событие:
db.execute(когда структурированный контекст недоступен)
- Поддержка вложенных транзакций через исправленный
yii\db\Transaction- публиковать события только при внешней фиксации (при коммите реальной транзакции)
- корректно сбрасывать события при внутреннем/внешнем откате (отмене точки сохранения или реальной транзакции)
- Единый контракт: все события публикуются с единой схемой данных.
- Внутри нет бизнес-логики.
Installation
Требуется PHP 8.5 или новее.
По умолчанию расширение подключается автоматически через yiisoft/yii2-composer (он генерирует vendor/yiisoft/extensions.php).
Если это не так:
- Убедитесь, что компонент приложения «massEvents» существует.
- Если ваше приложение не загружает
vendor/yiisoft/extensions.php, включите его в своей конфигурации (стандартные приложения Yii2 уже загружают).
В конфигурации приложения:
Все остальные параметры соединения полностью совместимы с yii\db\Connection и передаются без изменений.
Usages
Подпишитесь на события, используя события Yii:
Вы также можете подписаться на всеобщее событие (т.е. на все события):
Events
db.updateAlldb.deleteAlldb.insertdb.batchInsertdb.execute(резервный вариант, когда контекст команды невозможно получить)
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
Если в вашем приложении есть компонент очереди, который является экземпляром yii\queue\Queue, слой автоматически переключается в асинхронный режим:
- событие сериализуется в JSON
- пушатся через
PublishEventJob - джоба восстанавливает событие и публикует его через
MassEventLayer
Filters (добавляемые)
Встроенные инфраструктурные фильтры:
IgnoreTablesFilter— игнорироватьpayload.tableIgnoreSqlPatternsFilter— игнорировать SQL по регулярному выражению (полезно дляdb.execute)SamplingFilter— детерминированная выборка поevent.id
Пример:
IgnoreTablesFilter
IgnoreTablesFilter поддерживает:
- exact:
employee - wildcard:
log_*,*_tmp,user_?? - regex (preg):
/^audit_.+$/i
Режимы:
- по умолчанию exclude: игнорировать указанные/совпадающие таблицы
- only: публиковать только указанные/совпадающие таблицы
Примеры:
IgnoreSqlPatternsFilter
IgnoreSqlPatternsFilter поддерживает:
- exact:
employee - wildcard:
log_*,*_tmp,user_?? - regex (preg):
/^\s*SELECT\b/i
Режимы:
- по умолчанию exclude: игнорировать указанные/совпадающие SQL-запросы
- only: публиковать только указанные/совпадающие SQL-запросы
Примеры:
Сериализация
Сериализатор по умолчанию: illusiard\massEvents\services\VersionedJsonSerializer.
Обратная совместимость
Если полезные данные джобы не являются контейнером (нет schemaVersion/event), они обрабатываются как v0 (необработанный массив событий) и нормализуются.
Старые версии схемы могут быть преобразованы в текущую версию внутри VersionedJsonSerializer.
Версионный контейнер (полезная нагрузка очереди с обратной совместимостью)
При публикации в очереди события сериализуются с использованием версированного контейнера.
- Текущая схема:
illusiard.mass-events - Текущая версия:
schemaVersion:1
Пример контейнера (v1):
License
MIT
All versions of yii2-mass-event-layer with dependencies
yiisoft/yii2 Version ^2.0.55
ext-json Version *
ext-ctype Version *
yiisoft/yii2-queue Version ^2.3