From ad15a4dd77307028e1c24d7881ff47eda4c299c4 Mon Sep 17 00:00:00 2001 From: W0rma Date: Tue, 28 Oct 2025 09:00:44 +0100 Subject: [PATCH 1/3] Enable native lazy objects whenever possible. The LazyGhostTrait will be removed from symfony/var-exporter:8. --- .../unit/Codeception/Module/Doctrine2Test.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/unit/Codeception/Module/Doctrine2Test.php b/tests/unit/Codeception/Module/Doctrine2Test.php index ad09560..2bc9ccb 100644 --- a/tests/unit/Codeception/Module/Doctrine2Test.php +++ b/tests/unit/Codeception/Module/Doctrine2Test.php @@ -81,18 +81,18 @@ protected function _setUp() $connection = DriverManager::getConnection(['driver' => $sqliteDriver, 'memory' => true]); if (version_compare(InstalledVersions::getVersion('doctrine/orm'), '3', '>=')) { - $this->em = new EntityManager( - $connection, - ORMSetup::createAttributeMetadataConfiguration([$dir], true) - ); + $configuration = ORMSetup::createAttributeMetadataConfiguration([$dir], true); } else { - $this->em = new EntityManager( - $connection, - // @phpstan-ignore-next-line - ORMSetup::createAnnotationMetadataConfiguration([$dir], true) - ); + // @phpstan-ignore-next-line + $configuration = ORMSetup::createAnnotationMetadataConfiguration([$dir], true); } + if (PHP_VERSION_ID >= 80400 && method_exists($configuration, 'enableNativeLazyObjects')) { + $configuration->enableNativeLazyObjects(true); + } + + $this->em = new EntityManager($connection, $configuration); + (new SchemaTool($this->em))->createSchema([ $this->em->getClassMetadata(CompositePrimaryKeyEntity::class), $this->em->getClassMetadata(PlainEntity::class), From 3e6d1d7f13b2ca619342a8a908755c530c241236 Mon Sep 17 00:00:00 2001 From: W0rma Date: Tue, 28 Oct 2025 08:51:42 +0100 Subject: [PATCH 2/3] Fix usage of deprecated phpstan config option --- phpstan.neon | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpstan.neon b/phpstan.neon index 1805e37..f0dad3e 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -8,7 +8,6 @@ parameters: - tests/data/doctrine_fixtures/TestFixture1.php - tests/data/doctrine_fixtures/TestFixture2.php - tests/_support/UnitTester.php - checkMissingIterableValueType: false reportUnmatchedIgnoredErrors: true ignoreErrors: - path: tests/ @@ -21,3 +20,4 @@ parameters: message: '#Method \S+ has no return type specified#' - path: tests/ message: '#(?:Method|Property) .+ with generic (?:interface|class) \S+ does not specify its types#' + - identifier: missingType.iterableValue From 2eabfb647803136568ea2e079a1ff91791268c24 Mon Sep 17 00:00:00 2001 From: W0rma Date: Thu, 31 Jul 2025 11:48:14 +0200 Subject: [PATCH 3/3] setAccessible() has no effect as of PHP 8.1 --- src/Codeception/Module/Doctrine.php | 4 ---- src/Codeception/Util/ReflectionPropertyAccessor.php | 2 -- 2 files changed, 6 deletions(-) diff --git a/src/Codeception/Module/Doctrine.php b/src/Codeception/Module/Doctrine.php index cae50f7..e0457ca 100644 --- a/src/Codeception/Module/Doctrine.php +++ b/src/Codeception/Module/Doctrine.php @@ -299,7 +299,6 @@ protected function clean(): void $reflectedEm = new ReflectionClass($em); if ($reflectedEm->hasProperty('repositories')) { $property = $reflectedEm->getProperty('repositories'); - $property->setAccessible(true); $property->setValue($em, []); } $this->em->clear(); @@ -401,13 +400,11 @@ public function haveFakeRepository(string $className, array $methods = []): void //Support doctrine versions before 2.4.0 $property = $reflectedEm->getProperty('repositories'); - $property->setAccessible(true); $property->setValue($em, array_merge($property->getValue($em), [$className => $mock])); } elseif ($reflectedEm->hasProperty('repositoryFactory')) { //For doctrine 2.4.0+ versions $repositoryFactoryProperty = $reflectedEm->getProperty('repositoryFactory'); - $repositoryFactoryProperty->setAccessible(true); $repositoryFactory = $repositoryFactoryProperty->getValue($em); $reflectedRepositoryFactory = new ReflectionClass($repositoryFactory); @@ -419,7 +416,6 @@ public function haveFakeRepository(string $className, array $methods = []): void ); } elseif ($reflectedRepositoryFactory->hasProperty('repositoryList')) { $repositoryListProperty = $reflectedRepositoryFactory->getProperty('repositoryList'); - $repositoryListProperty->setAccessible(true); $repositoryHash = $em->getClassMetadata($className)->getName() . spl_object_id($em); $repositoryListProperty->setValue( diff --git a/src/Codeception/Util/ReflectionPropertyAccessor.php b/src/Codeception/Util/ReflectionPropertyAccessor.php index 557921e..3882292 100644 --- a/src/Codeception/Util/ReflectionPropertyAccessor.php +++ b/src/Codeception/Util/ReflectionPropertyAccessor.php @@ -25,7 +25,6 @@ public function getProperty(object $obj, string $field): mixed $reflectedEntity = new ReflectionClass($class); if ($reflectedEntity->hasProperty($field)) { $property = $reflectedEntity->getProperty($field); - $property->setAccessible(true); return $property->getValue($obj); } $class = get_parent_class($class); @@ -62,7 +61,6 @@ private function setPropertiesForClass(?object $obj, string $class, array $data) foreach ($reflectedEntity->getProperties() as $property) { if (isset($data[$property->name])) { - $property->setAccessible(true); $property->setValue($obj, $data[$property->name]); } }