PHPackages                             besnovatyj/yii2-cms-smart-domain-events - 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. besnovatyj/yii2-cms-smart-domain-events

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

besnovatyj/yii2-cms-smart-domain-events
=======================================

Реализация паттерна Domain Events с поддержкой асинхронности и транзакций для Yii2 CMS

v1.0.0(1mo ago)093MITPHPPHP &gt;=8.4

Since Jul 6Pushed 1mo agoCompare

[ Source](https://github.com/besnovatyj/yii2-cms-smart-domain-events)[ Packagist](https://packagist.org/packages/besnovatyj/yii2-cms-smart-domain-events)[ RSS](/packages/besnovatyj-yii2-cms-smart-domain-events/feed)WikiDiscussions master Synced 1w ago

READMEChangelogDependencies (2)Versions (2)Used By (3)

Domain Events Dispatcher
========================

[](#domain-events-dispatcher)

Архитектурная реализация паттерна **Domain Events** с поддержкой асинхронности и транзакционной безопасности для Yii2.

---

Содержание
----------

[](#содержание)

- [Обзор архитектуры](#%D0%BE%D0%B1%D0%B7%D0%BE%D1%80-%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D1%8B)
- [Компоненты системы](#%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82%D1%8B-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B)
- [Поток данных](#%D0%BF%D0%BE%D1%82%D0%BE%D0%BA-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)
- [Создание событий](#%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D0%B9)
- [Создание слушателей](#%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D0%BB%D1%83%D1%88%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%B9)
- [Конфигурация](#%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D1%8F)
- [Работа с транзакциями](#%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D1%82%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D1%8F%D0%BC%D0%B8)
- [Преимущества системы](#%D0%BF%D1%80%D0%B5%D0%B8%D0%BC%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B)

---

Обзор архитектуры
-----------------

[](#обзор-архитектуры)

```
┌─────────────────────────────────────────────────────────────────────────────┐
│  1. ENTITY (Aggregate Root)                                                 │
│     Contact::create() → recordEvent(new ContactMessageSent($contact))       │
│     Событие записывается в приватный массив $events                         │
└─────────────────────────────────────────────────────────────────────────────┘
                                      │
                                      ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│  2. REPOSITORY                                                              │
│     ContactRepository::save($contact)                                       │
│        → $contact->save()                                                   │
│        → $dispatcher->dispatchAll($contact->releaseEvents())                │
└─────────────────────────────────────────────────────────────────────────────┘
                                      │
                                      ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│  3. DISPATCHER CHAIN (Decorator Pattern)                                    │
│                                                                             │
│     EventDispatcher (interface)                                             │
│            │                                                                │
│            ├── DeferredEventDispatcher (откладывает события)                │
│            │            │                                                   │
│            │            └── AsyncEventDispatcher (помещает в Queue)         │
│            │                        │                                       │
│            │                        └── AsyncEventJob → Queue               │
│            │                                                                │
│            └── SimpleEventDispatcher (вызывает listeners синхронно)         │
└─────────────────────────────────────────────────────────────────────────────┘
                                      │
                                      ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│  4. QUEUE WORKER (отдельный процесс)                                        │
│     AsyncEventJob::execute()                                                │
│        → AsyncEventJobHandler::handle()                                     │
│        → SimpleEventDispatcher::dispatch(event)                             │
│        → [Listener1::handle(), Listener2::handle(), ...]                    │
└─────────────────────────────────────────────────────────────────────────────┘

```

---

Компоненты системы
------------------

[](#компоненты-системы)

### Интерфейсы и базовые классы

[](#интерфейсы-и-базовые-классы)

ФайлНазначение`AggregateRoot.php`Интерфейс для сущностей, генерирующих события`EventTrait.php`Трейт с реализацией записи и освобождения событий`EntityEvent.php`Базовый класс событий с безопасной сериализацией`TransactionManager.php`Обёртка для транзакций с отложенными событиями### Диспетчеры (`dispatchers/`)

[](#диспетчеры-dispatchers)

ФайлНазначение`EventDispatcher.php`Интерфейс диспетчера`SimpleEventDispatcher.php`Синхронный вызов слушателей по карте событий`DeferredEventDispatcher.php`Декоратор для отложенной отправки (транзакции)`AsyncEventDispatcher.php`Помещает события в очередь для асинхронной обработки### Задачи очереди (`jobs/`)

[](#задачи-очереди-jobs)

ФайлНазначение`Job.php`Базовый класс задач с автоматическим разрешением обработчика`AsyncEventJob.php`Задача очереди, содержащая сериализованное событие`AsyncEventJobHandler.php`Обработчик задачи, вызывающий SimpleEventDispatcher---

Поток данных
------------

[](#поток-данных)

### Пример: отправка контактной формы

[](#пример-отправка-контактной-формы)

```
// 1. Контроллер вызывает сервис
$contactService->send($form);

// 2. Сервис создаёт сущность
$contact = Contact::create($name, $email, $phone, $body, $notify_flag = true);
// Внутри: $this->events[] = new ContactMessageSent($contact);

// 3. Репозиторий сохраняет и диспатчит события
$this->repo->save($contact);
// Внутри:
//   $contact->save()                              → запись в БД, получение ID
//   $dispatcher->dispatchAll($contact->releaseEvents()) → отправка событий

// 4. DeferredEventDispatcher
// defer=false → сразу передаёт в AsyncEventDispatcher
// defer=true  → копит в очередь до вызова release()

// 5. AsyncEventDispatcher
$queue->push(new AsyncEventJob($event));
// Событие сериализуется и попадает в yii2-queue

// 6. Queue Worker (./yii queue/listen)
// AsyncEventJob::execute()
//   → AsyncEventJobHandler::handle($job)
//   → SimpleEventDispatcher::dispatch($job->event)
//   → ContactMessageEmailSentListener::handle($event)
//   → ContactMessageTGSentListener::handle($event)
```

---

Создание событий
----------------

[](#создание-событий)

### Базовый класс EntityEvent

[](#базовый-класс-entityevent)

Для безопасной сериализации событий, содержащих ActiveRecord сущности, используйте базовый класс `EntityEvent`:

```
