tito10047/doctrine-transaction

Library to manage doctrine transaction

0.1.1 2024-09-23 07:59 UTC

This package is auto-updated.

Last update: 2024-10-23 08:17:00 UTC


README

Tests Coverage Status

Doctrine Transaction

When you use Repository classes in your application, and don't use EntityManager directly, you can't use the transaction methods on Repository classes. This package allows you to use transactions anywhere in your application.

This package is also useful when you need to use multiple connections in the same transaction.

Setup

composer require tito10047/doctrine-transaction

Try it

#service.yaml
services:
    Tito10047\DoctrineTransaction\TransactionManagerInterface:
        class: Tito10047\DoctrineTransaction\TransactionManager
use Tito10047\DoctrineTransaction\TransactionManager;

class MyService
{

    public function __construct(private readonly TransactionManagerInterface $tm)
    {
    }

    public function myMethod()
    {
        $transaction = $this->tm->beginTransaction();
        try {
            // Your code
            $transaction->commit();
        } catch (\Exception $e) {
            $transaction->rollback();
            throw $e;
        }
    }
    
    public function myBatchMethod() {
        $transaction = $this->tm->beginTransaction();
        try {
            for($i = 0; $i < 100; $i++) {
                $myEntity = new MyEntity();
                if ($transaction->batchCommit($i,10)){
                    $transaction->clear(MyEntity::class);
                }
            }
            $transaction->commit();
        } catch (\Exception $e) {
            $transaction->rollback();
            throw $e;
        }    
    }
    
    public function myCallbacksMethod() {
        $transaction = $this->tm
            ->beginTransaction()
            ->addCommitHandler(function() {
                // Your code
            })
            ->addRollbackHandler(function() {
                // Your code
            });
        try {
            for($i = 0; $i < 100; $i++) {
                $myEntity = new MyEntity();
                if ($transaction->batchCommit($i,10)){
                    $transaction->clear(MyEntity::class);
                }
            }
            $transaction->commit();
        } catch (\Exception $e) {
            $transaction->rollback();
            throw $e;
        }
    }
    
    public function multipleConnections() {
        $transaction = $this->tm->beginTransaction('connection1','connection2');
        try {
            // Your code
            $transaction->commit();
        } catch (\Exception $e) {
            $transaction->rollback();
            throw $e;
        }
    }
}