Download the PHP package sbooker/domain-events without Composer
On this page you can find all versions of the php package sbooker/domain-events. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Informations about the package domain-events
Read in English
Domain Events Library (sbooker/domain-events
)
Простая, но мощная библиотека для реализации паттерна "События предметной области" (Domain Events) с упором на чистую архитектуру и принципы DDD.
Базовая библиотека в экосистеме sbooker/domain
Главная особенность — встроенный механизм для автоматического отслеживания, кто совершил действие (Actor), без загрязнения доменной модели.
Экосистема sbooker/domain
предоставляет надежные способы их асинхронной обработки — как с использованием брокера сообщений, так и без него.
Ключевые особенности
- Простота интеграции: Используйте трейт
DomainEventCollector
в ваших сущностях. - Автоматическое обогащение событий: Встроенный декоратор
ActorAwarePublisher
автоматически добавляет к событию информацию о текущем пользователе (Actor
). - Нулевые зависимости: Библиотека не зависит от других библиотек или какого-либо фреймворка.
- Гибкость: Основана на простых интерфейсах (
Publisher
,ActorStorage
,DomainEventSubscriber
), которые вы реализуете в своей инфраструктуре или используете библиотеки из экосистемыsbooker/domain
.
Установка
Архитектура и компоненты
DomainEvent
: Абстрактный класс, от которого наследуются все ваши события. Уже содержит ID сущности, время возникновения и опционально —Actor
.DomainEventCollector
: Трейт, который вы добавляете в свои сущности (Агрегаты). Он предоставляет метод для сбора (publish
) и последующей отправки (dispatchEvents
) событий.Publisher
: Интерфейс для диспетчера событий. Вы должны предоставить его реализацию или использовать библиотеку sbooker/domain-events-persistence.Actor
: Простой объект, идентифицирующий пользователя, который инициировал действие.ActorStorage
: Интерфейс для получения текущегоActor
из контекста приложения (например, из сессии или токена безопасности).ActorAwarePublisher
: Декоратор для вашегоPublisher
, который автоматически "внедряет"Actor
в событие перед его публикацией.
Быстрый старт
1. Подготовьте вашу сущность и событие
Используйте трейт DomainEventCollector
в вашем агрегате и определите класс события.
2. Реализуйте сохранение событий (Transactional Outbox)
Рекомендуется сохранять события в специальную таблицу (event
) в той же базе данных и в той же транзакции, что и сущность.
Для этого используйте решение из sbooker/domain-events-persistence и sbooker/transaction-manager. Или напишите собственное:
В сервисном слое вы используете OutboxPublisher
. Весь процесс сохранения происходит внутри одной транзакции.
3. Асинхронно обработайте события
Для обработки событий используется фоновый процесс (воркер), который читает события из таблицы.
Экосистема sbooker/domain
поддерживает два основных подхода:
Подход 1: Прямая обработка (без брокера сообщений)
Этот подход идеален, когда вы хотите избежать усложнения инфраструктуры (без RabbitMQ, Kafka и т.д.), но при этом обеспечить надежную параллельную обработку событий.
Библиотека sbooker/domain-events-persistence предоставляет готовые инструменты для запуска нескольких воркеров, которые не будут мешать друг другу, благодаря механизму пессимистичных блокировок.
Пример воркера-обработчика:
Подход 2: Ретрансляция в брокер сообщений (классический Outbox)
Классический паттерн для микросервисной архитектуры или когда требуется интеграция с внешними системами через брокер сообщений.
В этом случае задача фонового процесса — всего лишь гарантированно доставить событие из таблицы в RabbitMQ (или другой брокер).
Пример воркера-ретранслятора:
License
See LICENSE file.