From 165dc2ce051b7c4e06358b8a8bbd26e782fd9999 Mon Sep 17 00:00:00 2001 From: Malte Kuhr Date: Fri, 26 Sep 2025 08:38:54 +0200 Subject: [PATCH 1/4] Add database afterRollback callback support and tests --- .../Database/Concerns/ManagesTransactions.php | 17 +++++++++++++ src/Illuminate/Support/Facades/DB.php | 1 + .../Database/DatabaseTransactionsTest.php | 25 +++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/src/Illuminate/Database/Concerns/ManagesTransactions.php b/src/Illuminate/Database/Concerns/ManagesTransactions.php index 260bcd66d550..7a8a4d27fbc4 100644 --- a/src/Illuminate/Database/Concerns/ManagesTransactions.php +++ b/src/Illuminate/Database/Concerns/ManagesTransactions.php @@ -353,4 +353,21 @@ public function afterCommit($callback) throw new RuntimeException('Transactions Manager has not been set.'); } + + /** + * Execute the callback after a transaction rolls back. + * + * @param callable $callback + * @return void + * + * @throws \RuntimeException + */ + public function afterRollback($callback) + { + if ($this->transactionsManager) { + return $this->transactionsManager->addCallbackForRollback($callback); + } + + throw new RuntimeException('Transactions Manager has not been set.'); + } } diff --git a/src/Illuminate/Support/Facades/DB.php b/src/Illuminate/Support/Facades/DB.php index a43f9443e173..627c72e8530b 100644 --- a/src/Illuminate/Support/Facades/DB.php +++ b/src/Illuminate/Support/Facades/DB.php @@ -114,6 +114,7 @@ * @method static void rollBack(int|null $toLevel = null) * @method static int transactionLevel() * @method static void afterCommit(callable $callback) + * @method static void afterRollback(callable $callback) * * @see \Illuminate\Database\DatabaseManager */ diff --git a/tests/Integration/Database/DatabaseTransactionsTest.php b/tests/Integration/Database/DatabaseTransactionsTest.php index 58894d01ae5e..a378c800d54b 100644 --- a/tests/Integration/Database/DatabaseTransactionsTest.php +++ b/tests/Integration/Database/DatabaseTransactionsTest.php @@ -105,6 +105,31 @@ public function testTransactionsDoNotAffectDifferentConnections() $this->assertTrue($secondObject->ran); $this->assertFalse($thirdObject->ran); } + + public function testAfterRollbackCallbacksAreExecuted() + { + $afterCommitRan = false; + $afterRollbackRan = false; + + try { + DB::transaction(function () use (&$afterCommitRan, &$afterRollbackRan) { + DB::afterCommit(function () use (&$afterCommitRan) { + $afterCommitRan = true; + }); + + DB::afterRollback(function () use (&$afterRollbackRan) { + $afterRollbackRan = true; + }); + + throw new \RuntimeException('rollback'); + }); + } catch (\RuntimeException) { + // Ignore the expected rollback exception. + } + + $this->assertFalse($afterCommitRan); + $this->assertTrue($afterRollbackRan); + } } class TestObjectForTransactions From 06329b31214e5fc8a242e0d25a421218f64604b8 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Fri, 26 Sep 2025 10:41:00 -0500 Subject: [PATCH 2/4] Update ManagesTransactions.php --- src/Illuminate/Database/Concerns/ManagesTransactions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Database/Concerns/ManagesTransactions.php b/src/Illuminate/Database/Concerns/ManagesTransactions.php index 7a8a4d27fbc4..9874727d26c9 100644 --- a/src/Illuminate/Database/Concerns/ManagesTransactions.php +++ b/src/Illuminate/Database/Concerns/ManagesTransactions.php @@ -362,7 +362,7 @@ public function afterCommit($callback) * * @throws \RuntimeException */ - public function afterRollback($callback) + public function afterRollBack($callback) { if ($this->transactionsManager) { return $this->transactionsManager->addCallbackForRollback($callback); From c9eccc896bd95f8726dd9fa9e750c1a737b2e353 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Fri, 26 Sep 2025 10:41:12 -0500 Subject: [PATCH 3/4] Update DB.php --- src/Illuminate/Support/Facades/DB.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Support/Facades/DB.php b/src/Illuminate/Support/Facades/DB.php index 627c72e8530b..a9c8e7f30d15 100644 --- a/src/Illuminate/Support/Facades/DB.php +++ b/src/Illuminate/Support/Facades/DB.php @@ -114,7 +114,7 @@ * @method static void rollBack(int|null $toLevel = null) * @method static int transactionLevel() * @method static void afterCommit(callable $callback) - * @method static void afterRollback(callable $callback) + * @method static void afterRollBack(callable $callback) * * @see \Illuminate\Database\DatabaseManager */ From 48f1cbc4e97df2ce030262cbf19d968064ef5d9f Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Fri, 26 Sep 2025 10:41:34 -0500 Subject: [PATCH 4/4] Update DatabaseTransactionsTest.php --- tests/Integration/Database/DatabaseTransactionsTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Integration/Database/DatabaseTransactionsTest.php b/tests/Integration/Database/DatabaseTransactionsTest.php index a378c800d54b..de9213461270 100644 --- a/tests/Integration/Database/DatabaseTransactionsTest.php +++ b/tests/Integration/Database/DatabaseTransactionsTest.php @@ -117,7 +117,7 @@ public function testAfterRollbackCallbacksAreExecuted() $afterCommitRan = true; }); - DB::afterRollback(function () use (&$afterRollbackRan) { + DB::afterRollBack(function () use (&$afterRollbackRan) { $afterRollbackRan = true; });