Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 7 additions & 13 deletions phpstan-baseline.neon
Original file line number Diff line number Diff line change
Expand Up @@ -528,18 +528,6 @@ parameters:
count: 1
path: tests/DependencyInjection/AbstractMongoDBExtensionTestCase.php

-
message: '#^Call to function method_exists\(\) with ''Doctrine\\\\ODM\\\\MongoDB\\\\Configuration'' and ''setUseLazyGhostObje…'' will always evaluate to true\.$#'
identifier: function.alreadyNarrowedType
count: 1
path: tests/DependencyInjection/ConfigurationTest.php

-
message: '#^Call to function method_exists\(\) with ''Doctrine\\\\ODM\\\\MongoDB\\\\Configuration'' and ''setUseNativeLazyObj…'' will always evaluate to true\.$#'
identifier: function.alreadyNarrowedType
count: 1
path: tests/DependencyInjection/ConfigurationTest.php

-
message: '#^Method Doctrine\\Bundle\\MongoDBBundle\\Tests\\DependencyInjection\\ConfigurationTest\:\:testFullConfiguration\(\) has parameter \$config with no value type specified in iterable type array\.$#'
identifier: missingType.iterableValue
Expand Down Expand Up @@ -829,7 +817,13 @@ parameters:
path: tests/ServiceRepositoryTest.php

-
message: '#^Call to function method_exists\(\) with Doctrine\\ODM\\MongoDB\\Configuration and ''setUseLazyGhostObje…'' will always evaluate to true\.$#'
message: '#^Call to function method_exists\(\) with ''Doctrine\\\\ODM\\\\MongoDB\\\\Configuration'' and ''setUseLazyGhostObje…'' will always evaluate to true\.$#'
identifier: function.alreadyNarrowedType
count: 1
path: tests/TestCase.php

-
message: '#^Call to function method_exists\(\) with ''Doctrine\\\\ODM\\\\MongoDB\\\\Configuration'' and ''setUseNativeLazyObj…'' will always evaluate to true\.$#'
identifier: function.alreadyNarrowedType
count: 1
path: tests/TestCase.php
6 changes: 6 additions & 0 deletions src/DependencyInjection/DoctrineMongoDBExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -472,6 +472,12 @@ public function load(array $configs, ContainerBuilder $container): void
$configuratorDefinition->addMethodCall('loadTypes', [$config['types']]);
}

// Disable proxy class generation for PHP 8.4 native lazy objects
if ($config['enable_native_lazy_objects']) {
$config['auto_generate_proxy_classes'] = ODMConfiguration::AUTOGENERATE_NEVER;
$container->removeDefinition('doctrine_mongodb.odm.proxy_cache_warmer');
}

// set some options as parameters and unset them
$config = $this->overrideParameters($config, $container);

Expand Down
4 changes: 4 additions & 0 deletions src/DoctrineMongoDBBundle.php
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,10 @@ public function boot(): void
private function registerAutoloader(DocumentManager $documentManager): void
{
$configuration = $documentManager->getConfiguration();
if ($configuration->isNativeLazyObjectEnabled() || $configuration->isLazyGhostObjectEnabled()) {
return;
}

if ($configuration->getAutoGenerateProxyClasses() !== Configuration::AUTOGENERATE_FILE_NOT_EXISTS) {
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,10 @@ public function testDependencyInjectionConfigurationDefaults(): void
$loader->load(DoctrineMongoDBExtensionTest::buildConfiguration(), $container);

$this->assertEquals('MongoDBODMProxies', $container->getParameter('doctrine_mongodb.odm.proxy_namespace'));
$this->assertEquals(Configuration::AUTOGENERATE_EVAL, $container->getParameter('doctrine_mongodb.odm.auto_generate_proxy_classes'));
$this->assertEquals(
self::useNativeLazyObject() ? Configuration::AUTOGENERATE_NEVER : Configuration::AUTOGENERATE_EVAL,
$container->getParameter('doctrine_mongodb.odm.auto_generate_proxy_classes'),
);

$config = DoctrineMongoDBExtensionTest::buildConfiguration([
'proxy_namespace' => 'MyProxies',
Expand Down Expand Up @@ -375,7 +378,7 @@ public function testDependencyInjectionImportsOverrideDefaults(): void
$container->getCompilerPassConfig()->setRemovingPasses([]);
$container->compile();

$this->assertTrue((bool) $container->getParameter('doctrine_mongodb.odm.auto_generate_proxy_classes'));
$this->assertSame(self::useNativeLazyObject(), ! $container->getParameter('doctrine_mongodb.odm.auto_generate_proxy_classes'));
}

public function testResolveTargetDocument(): void
Expand Down
9 changes: 3 additions & 6 deletions tests/DependencyInjection/ConfigurationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@
use Doctrine\Bundle\MongoDBBundle\Tests\Fixtures\Filter\DisabledFilter;
use Doctrine\Bundle\MongoDBBundle\Tests\Fixtures\Repository\CustomGridFSRepository;
use Doctrine\Bundle\MongoDBBundle\Tests\Fixtures\Repository\CustomRepository;
use Doctrine\Bundle\MongoDBBundle\Tests\TestCase;
use Doctrine\ODM\MongoDB\Configuration as ODMConfiguration;
use Doctrine\ODM\MongoDB\Repository\DefaultGridFSRepository;
use Doctrine\ODM\MongoDB\Repository\DocumentRepository;
use Generator;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\TestCase;
use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait;
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
use Symfony\Component\Config\Definition\Processor;
Expand All @@ -26,9 +26,6 @@
use function array_key_exists;
use function array_merge;
use function file_get_contents;
use function method_exists;

use const PHP_VERSION_ID;

class ConfigurationTest extends TestCase
{
Expand All @@ -44,8 +41,8 @@ public function testDefaults(): void
'auto_generate_hydrator_classes' => false,
'auto_generate_proxy_classes' => ODMConfiguration::AUTOGENERATE_EVAL,
'auto_generate_persistent_collection_classes' => ODMConfiguration::AUTOGENERATE_NEVER,
'enable_lazy_ghost_objects' => method_exists(ODMConfiguration::class, 'setUseLazyGhostObject'),
'enable_native_lazy_objects' => PHP_VERSION_ID >= 80400 && method_exists(ODMConfiguration::class, 'setUseNativeLazyObject'),
'enable_lazy_ghost_objects' => self::useLazyGhostObject(),
'enable_native_lazy_objects' => self::useNativeLazyObject(),
'default_database' => 'default',
'document_managers' => [],
'connections' => [],
Expand Down
16 changes: 13 additions & 3 deletions tests/TestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,24 @@ public static function createTestDocumentManager(array $paths = []): DocumentMan
$config->setMetadataDriverImpl(new AttributeDriver($paths));
$config->setMetadataCache(new ArrayAdapter());

if (PHP_VERSION_ID >= 80400 && method_exists($config, 'setUseLazyGhostObject')) {
if (self::useNativeLazyObject()) {
$config->setUseNativeLazyObject(true);
} elseif (self::useLazyGhostObject()) {
$config->setUseLazyGhostObject(true);
} elseif (method_exists($config, 'setUseLazyGhostObject')) {
$config->setUseLazyGhostObject(false);
}

$uri = getenv('MONGODB_URI') ?: throw new RuntimeException('The MONGODB_URI environment variable is not set.');

return DocumentManager::create(new Client($uri), $config);
}

public static function useNativeLazyObject(): bool
{
return PHP_VERSION_ID >= 80400 && method_exists(Configuration::class, 'setUseNativeLazyObject');
}

public static function useLazyGhostObject(): bool
{
return method_exists(Configuration::class, 'setUseLazyGhostObject') && ! self::useNativeLazyObject();
}
}
Loading