sbooker/domain-events-persistence-doctrine

Domain events storage Doctrine implementation

2.3.2 2024-02-07 15:35 UTC

This package is auto-updated.

Last update: 2025-08-23 12:58:00 UTC


README

Read in English

Doctrine Persistence for Domain Events (sbooker/doctrine-domain-events-persistence)

Latest Version Software License PHP Version Total Downloads

Готовая реализация хранилищ для sbooker/domain-events-persistence с использованием Doctrine ORM.

Назначение библиотеки

Эта библиотека предоставляет единый, готовый к использованию Doctrine-репозиторий, который реализует все интерфейсы хранения, определенные в sbooker/domain-events-persistence:

  • ConsumeStorage
  • SearchStorage
  • CleanExpiredStorage
  • IdentityStorage

Использование этой библиотеки избавляет вас от необходимости писать собственную реализацию этих интерфейсов для Doctrine.

Установка

composer require sbooker/domain-events-persistence-doctrine

Зависимости:

  • sbooker/domain-events-persistence
  • doctrine/orm

Использование

Шаг 1: Настройте маппинг для PersistentEvent

Вам необходимо сообщить Doctrine, как сохранять сущность Sbooker\DomainEvents\Persistence\PersistentEvent в базу данных.

Ниже приведен наиболее распространенный сценарий, где position является автоинкрементным первичным ключом.

Пример маппинга (XML):

<!-- config/doctrine/Sbooker.DomainEvents.Persistence.PersistentEvent.orm.xml -->
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping">
    <entity name="Sbooker\DomainEvents\Persistence\PersistentEvent"
            table="event"
            repository-class="Sbooker\DomainEvents\Persistence\Doctrine\PersistentEventDoctrineRepository">

        <!-- `position` как автоинкрементный первичный ключ -->
        <id name="position" type="bigint"> <!-- или integer, если уверены что емкости хватит -->
            <generator strategy="IDENTITY"/>
            <options>
                <option name="unsigned">true</option>
            </options>
        </id>

        <!-- `id` события как уникальный идентификатор (не первичный ключ) -->
        <field name="id" type="uuid" unique="true" />

        <field name="name" type="string" length="255" />
        <field name="occurredAt" type="datetimetz_immutable" />
        <field name="entityId" type="uuid" />
        <field name="payload" type="json">
            <options>
                <option name="jsonb">true</option>
            </options>
        </field>

        <indexes>
            <!-- Индекс для поиска по именам событий (для ConsumeStorage) -->
            <index name="ix_event_name" columns="name"/>
            <!-- Индекс для поиска по ID сущности (для SearchStorage) -->
            <index name="ix_event_entity_id" columns="entity_id"/>
            <!-- Индекс для поиска по времени возникновения события (для CleanExpiredStorage и SearchStorage) -->
            <index name="ix_event_occurred_at" columns="occurred_at"/>
        </indexes>

    </entity>
</doctrine-mapping>

Важно: Укажите repository-class в маппинге, чтобы Doctrine знала, что для этой сущности нужно использовать репозиторий из этой библиотеки.

Шаг 2: Используйте репозиторий в DI-контейнере

Теперь вы можете получить репозиторий из EntityManager и передать его в ConsumerFactory и другие сервисы, которым он нужен.

// bootstrap.php или ваш DI-контейнер

use Doctrine\ORM\EntityManagerInterface;
use Sbooker\DomainEvents\Persistence\ConsumerFactory;

/** @var EntityManagerInterface $entityManager */

// 1. Получаем наш готовый репозиторий из EntityManager
$persistentEventRepository = $entityManager->getRepository(\Sbooker\DomainEvents\Persistence\PersistentEvent::class);

// 2. Передаем его в ConsumerFactory и другие сервисы
$consumerFactory = new ConsumerFactory(
    $persistentEventRepository, // Реализует ConsumeStorage
    // ...
);

$myAuditService = new MyAuditService(
    $persistentEventRepository // Реализует SearchStorage
);

License

See LICENSE file.