sbooker / domain-events-persistence-doctrine
Domain events storage Doctrine implementation
Installs: 4 464
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
Requires
- php: ^7.4 || ^8.0
- doctrine/orm: ^2.7
- sbooker/domain-events: ^2.0
- sbooker/domain-events-persistence: 2.5.2 || ^2.6
Requires (Dev)
- doctrine/cache: ^1.12
- gamez/ramsey-uuid-normalizer: ^2.0 || ^3.0
- phpdocumentor/reflection-docblock: ^5.3
- phpunit/phpunit: ^9.0
- ramsey/uuid-doctrine: ^1.6
- sbooker/doctrine-transaction-handler: ^2.0
- sbooker/persistent-pointer-doctrine: ^1.0
- sbooker/persistent-sequences: ^0.5.0
- sbooker/transaction-manager: ^2.2
- symfony/property-access: ^5.0 || ^6.0
- symfony/property-info: ^5.0 || ^6.0
- symfony/serializer: ^5.0 || ^6.0
Suggests
- gamez/ramsey-uuid-normalizer: ^2.0 || ^3.0
- ramsey/uuid-doctrine: ^1.6
- sbooker/doctrine-transaction-handler: ^2.0
- sbooker/persistent-pointer-doctrine: ^1.0
- symfony/property-access: ^5.0 || ^6.0
- symfony/property-info: ^5.0 || ^6.0
- symfony/serializer: ^5.0 || ^6.0
README
Doctrine Persistence for Domain Events (sbooker/doctrine-domain-events-persistence
)
Готовая реализация хранилищ для 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.