Skip to content

Commit 6cd47b8

Browse files
authored
Use LazyGhostObject for proxy objects (#877)
Add use_lazy_ghost_object configuration
1 parent 783d281 commit 6cd47b8

File tree

4 files changed

+26
-4
lines changed

4 files changed

+26
-4
lines changed

config/mongodb.php

+1-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
use Doctrine\Bundle\MongoDBBundle\Repository\ContainerRepositoryFactory;
99
use Doctrine\ODM\MongoDB\DocumentManager;
1010
use Doctrine\ODM\MongoDB\Tools\ResolveTargetDocumentListener;
11-
use ProxyManager\Proxy\GhostObjectInterface;
1211
use Symfony\Bridge\Doctrine\ContainerAwareEventManager;
1312
use Symfony\Bridge\Doctrine\Security\User\EntityUserProvider;
1413
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
@@ -54,7 +53,7 @@
5453
'%doctrine_mongodb.odm.document_managers%',
5554
'%doctrine_mongodb.odm.default_connection%',
5655
'%doctrine_mongodb.odm.default_document_manager%',
57-
GhostObjectInterface::class,
56+
abstract_arg('Proxy Interface Name'),
5857
service('service_container'),
5958
])
6059

src/DependencyInjection/Configuration.php

+8
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use function is_array;
1616
use function is_string;
1717
use function json_decode;
18+
use function method_exists;
1819
use function preg_match;
1920

2021
/**
@@ -39,6 +40,13 @@ public function getConfigTreeBuilder(): TreeBuilder
3940
->children()
4041
->scalarNode('proxy_namespace')->defaultValue('MongoDBODMProxies')->end()
4142
->scalarNode('proxy_dir')->defaultValue('%kernel.cache_dir%/doctrine/odm/mongodb/Proxies')->end()
43+
->booleanNode('enable_lazy_ghost_objects')
44+
->defaultValue(method_exists(ODMConfiguration::class, 'setUseLazyGhostObject'))
45+
->validate()
46+
->ifTrue(static fn ($v) => $v === true && ! method_exists(ODMConfiguration::class, 'setUseLazyGhostObject'))
47+
->thenInvalid('Lazy ghost objects require doctrine/mongodb-odm 2.10 or higher.')
48+
->end()
49+
->end()
4250
->scalarNode('auto_generate_proxy_classes')
4351
->defaultValue(ODMConfiguration::AUTOGENERATE_EVAL)
4452
->beforeNormalization()

src/DependencyInjection/DoctrineMongoDBExtension.php

+14-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@
1919
use Doctrine\ODM\MongoDB\Mapping\Annotations\Document;
2020
use Doctrine\ODM\MongoDB\Mapping\Driver\AttributeDriver;
2121
use Doctrine\Persistence\Mapping\Driver\MappingDriverChain;
22+
use Doctrine\Persistence\Proxy;
2223
use InvalidArgumentException;
2324
use MongoDB\Client;
25+
use ProxyManager\Proxy\LazyLoadingInterface;
2426
use Symfony\Bridge\Doctrine\DependencyInjection\AbstractDoctrineExtension;
2527
use Symfony\Bridge\Doctrine\Messenger\DoctrineClearEntityManagerWorkerSubscriber;
2628
use Symfony\Component\Cache\Adapter\ApcuAdapter;
@@ -106,6 +108,10 @@ public function load(array $configs, ContainerBuilder $container): void
106108
$container->removeDefinition('doctrine_mongodb.odm.command.load_data_fixtures');
107109
}
108110

111+
// Requires doctrine/mongodb-odm 2.10
112+
$container->getDefinition('doctrine_mongodb')
113+
->setArgument(5, $config['enable_lazy_ghost_objects'] ? Proxy::class : LazyLoadingInterface::class);
114+
109115
// load the connections
110116
$this->loadConnections($config['connections'], $container);
111117

@@ -117,6 +123,7 @@ public function load(array $configs, ContainerBuilder $container): void
117123
$config['default_document_manager'],
118124
$config['default_database'],
119125
$container,
126+
$config['enable_lazy_ghost_objects'],
120127
);
121128

122129
if ($config['resolve_target_documents']) {
@@ -198,7 +205,7 @@ protected function overrideParameters(array $options, ContainerBuilder $containe
198205
* @param string $defaultDB The default db name
199206
* @param ContainerBuilder $container A ContainerBuilder instance
200207
*/
201-
protected function loadDocumentManagers(array $dmConfigs, string|null $defaultDM, string $defaultDB, ContainerBuilder $container): void
208+
protected function loadDocumentManagers(array $dmConfigs, string|null $defaultDM, string $defaultDB, ContainerBuilder $container, bool $useLazyGhostObject = false): void
202209
{
203210
$dms = [];
204211
foreach ($dmConfigs as $name => $documentManager) {
@@ -208,6 +215,7 @@ protected function loadDocumentManagers(array $dmConfigs, string|null $defaultDM
208215
$defaultDM,
209216
$defaultDB,
210217
$container,
218+
$useLazyGhostObject,
211219
);
212220
$dms[$name] = sprintf('doctrine_mongodb.odm.%s_document_manager', $name);
213221
}
@@ -223,7 +231,7 @@ protected function loadDocumentManagers(array $dmConfigs, string|null $defaultDM
223231
* @param string $defaultDB The default db name
224232
* @param ContainerBuilder $container A ContainerBuilder instance
225233
*/
226-
protected function loadDocumentManager(array $documentManager, string|null $defaultDM, string $defaultDB, ContainerBuilder $container): void
234+
protected function loadDocumentManager(array $documentManager, string|null $defaultDM, string $defaultDB, ContainerBuilder $container, bool $useLazyGhostObject = false): void
227235
{
228236
$connectionName = $documentManager['connection'] ?? $documentManager['name'];
229237
$configurationId = sprintf('doctrine_mongodb.odm.%s_configuration', $documentManager['name']);
@@ -257,6 +265,10 @@ protected function loadDocumentManager(array $documentManager, string|null $defa
257265
'setAutoGeneratePersistentCollectionClasses' => '%doctrine_mongodb.odm.auto_generate_persistent_collection_classes%',
258266
];
259267

268+
if ($useLazyGhostObject) {
269+
$methods['setUseLazyGhostObject'] = $useLazyGhostObject;
270+
}
271+
260272
if (method_exists(ODMConfiguration::class, 'setUseTransactionalFlush')) {
261273
$methods['setUseTransactionalFlush'] = $documentManager['use_transactional_flush'];
262274
}

tests/DependencyInjection/ConfigurationTest.php

+3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
use function array_key_exists;
2424
use function file_get_contents;
25+
use function method_exists;
2526

2627
class ConfigurationTest extends TestCase
2728
{
@@ -37,6 +38,7 @@ public function testDefaults(): void
3738
'auto_generate_hydrator_classes' => false,
3839
'auto_generate_proxy_classes' => ODMConfiguration::AUTOGENERATE_EVAL,
3940
'auto_generate_persistent_collection_classes' => ODMConfiguration::AUTOGENERATE_NEVER,
41+
'enable_lazy_ghost_objects' => method_exists(ODMConfiguration::class, 'setUseLazyGhostObject'),
4042
'default_database' => 'default',
4143
'document_managers' => [],
4244
'connections' => [],
@@ -69,6 +71,7 @@ public function testFullConfiguration(array $config): void
6971
'auto_generate_hydrator_classes' => 1,
7072
'auto_generate_proxy_classes' => ODMConfiguration::AUTOGENERATE_FILE_NOT_EXISTS,
7173
'auto_generate_persistent_collection_classes' => ODMConfiguration::AUTOGENERATE_EVAL,
74+
'enable_lazy_ghost_objects' => method_exists(ODMConfiguration::class, 'setUseLazyGhostObject'),
7275
'default_connection' => 'conn1',
7376
'default_database' => 'default_db_name',
7477
'default_document_manager' => 'default_dm_name',

0 commit comments

Comments
 (0)