sbooker / doctrine-transaction-handler
Doctrine transaction handler implementation for sbooker/transaction-manager
Installs: 5 129
Dependents: 2
Suggesters: 4
Security: 0
Stars: 0
Watchers: 1
Forks: 1
Open Issues: 0
Requires
- php: ^7.4 || ^8.0
- doctrine/orm: ^2.4
- sbooker/transaction-manager: ^2.3
This package is auto-updated.
Last update: 2025-08-23 11:28:42 UTC
README
Doctrine Transaction Handler (sbooker/doctrine-transaction-handler
)
Готовая реализация TransactionHandler
для интеграции sbooker/transaction-manager с Doctrine ORM.
Назначение библиотеки
Эта библиотека — "мост" между абстрактным менеджером транзакций и Doctrine ORM. Она избавляет вас от необходимости писать собственный адаптер.
Так же библиотека решает фундаментальную проблему управления памятью и состоянием в долгоживущих процессах (воркерах, консьюмерах), которые являются одним из сценариев использования transaction-manager
.
Ключевые особенности
- Автоматическое управление памятью и состоянием: После каждого успешного коммита обработчик вызывает
EntityManager::clear()
. Это критически важно для долгоживущих процессов и обеспечивает:- Предотвращение утечек памяти: Unit of Work не разрастается бесконечно.
- Гарантию свежести данных: На каждой новой итерации сущности будут загружены из БД заново.
- Изоляцию операций: Состояние предыдущей транзакции не влияет на следующую.
- Готовое решение: Просто установите и используйте.
- Пессимистичная блокировка: Гарантирует целостность данных при одновременном доступе "из коробки" (
LockMode::PESSIMISTIC_WRITE
). - Правильная обработка исключений: Корректно преобразует
UniqueConstraintViolationException
вUniqueConstraintViolation
изtransaction-manager
.
Установка
composer require sbooker/doctrine-transaction-handler
Зависимости:
sbooker/transaction-manager
doctrine/orm
Использование
Использование библиотеки сводится к одному шагу — созданию экземпляра DoctrineTransactionHandler
и передаче его в TransactionManager
.
// bootstrap.php или ваш DI-контейнер use Doctrine\ORM\EntityManagerInterface; use Sbooker\TransactionManager\TransactionManager; use Sbooker\TransactionManager\DoctrineTransactionHandler; /** @var EntityManagerInterface $entityManager */ // 1. Создаем обработчик, передав в него EntityManager $transactionHandler = new DoctrineTransactionHandler($entityManager); // 2. Создаем менеджер транзакций $transactionManager = new TransactionManager($transactionHandler); // 3. Готово! Теперь используйте $transactionManager в вашем прикладном коде $transactionManager->transactional(function () { // ... ваш код ... }); // После успешного выполнения этого блока, $entityManager->clear() будет вызван автоматически.
После этой простой настройки вы можете полноценно использовать TransactionManager
во всем приложении, как описано в его документации.
License
See LICENSE file.