From d6845980ce6b3ddf9084dca0e8c6ebc778f6aa4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Ols=CC=8Cavsky=CC=81?= Date: Wed, 17 Feb 2021 15:24:54 +0100 Subject: [PATCH] Method hydrateAll() does not take into account possible exception from hydrateAllData() which in turn does not call cleanup() --- .../Internal/Hydration/AbstractHydrator.php | 9 +++--- .../ORM/Hydration/AbstractHydratorTest.php | 28 +++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php index 2e610d6406f..61d502dbe5b 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php @@ -205,12 +205,13 @@ public function hydrateAll($stmt, $resultSetMapping, array $hints = []) $this->_hints = $hints; $this->_em->getEventManager()->addEventListener([Events::onClear], $this); - $this->prepare(); - $result = $this->hydrateAllData(); - - $this->cleanup(); + try { + $result = $this->hydrateAllData(); + } finally { + $this->cleanup(); + } return $result; } diff --git a/tests/Doctrine/Tests/ORM/Hydration/AbstractHydratorTest.php b/tests/Doctrine/Tests/ORM/Hydration/AbstractHydratorTest.php index 00aefa398d9..a8fdcb52fac 100644 --- a/tests/Doctrine/Tests/ORM/Hydration/AbstractHydratorTest.php +++ b/tests/Doctrine/Tests/ORM/Hydration/AbstractHydratorTest.php @@ -10,6 +10,7 @@ use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Events; use Doctrine\ORM\Internal\Hydration\AbstractHydrator; +use Doctrine\ORM\NoResultException; use Doctrine\ORM\Query\ResultSetMapping; use Doctrine\Tests\OrmFunctionalTestCase; use PHPUnit_Framework_MockObject_MockObject; @@ -106,4 +107,31 @@ public function testHydrateAllRegistersAndClearsAllAttachedListeners(): void $this->hydrator->hydrateAll($this->mockStatement, $this->mockResultMapping); } + + /** + * @group #DDC-8482 + */ + public function testHydrateAllClearsAllAttachedListenersEvenOnError(): void + { + $this + ->mockEventManager + ->expects(self::at(0)) + ->method('addEventListener') + ->with([Events::onClear], $this->hydrator); + + $this + ->mockEventManager + ->expects(self::at(1)) + ->method('removeEventListener') + ->with([Events::onClear], $this->hydrator); + + $this + ->hydrator + ->expects(self::once()) + ->method('hydrateAllData') + ->willThrowException(new NoResultException()); + + $this->expectException(NoResultException::class); + $this->hydrator->hydrateAll($this->mockStatement, $this->mockResultMapping); + } }