From 142a3dfce6a611985a005ebac00dc88c95066d08 Mon Sep 17 00:00:00 2001 From: NanoSector Date: Thu, 11 Apr 2024 20:05:28 +0200 Subject: [PATCH] Wire up type aliases support in EntityValueResolver This is an addendum to PR https://github.com/symfony/symfony/issues/51765 in the Symfony Doctrine Bridge, which adds type alias support to EntityValueResolver. This code injects the doctrine.orm.resolve_target_entities configuration into the EntityValueResolver class. --- src/DependencyInjection/DoctrineExtension.php | 29 ++++++++++--------- tests/ContainerTest.php | 6 ++++ .../DoctrineExtensionTest.php | 20 +++++++++++-- 3 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/DependencyInjection/DoctrineExtension.php b/src/DependencyInjection/DoctrineExtension.php index 30cbfa6f1..f8d125da8 100644 --- a/src/DependencyInjection/DoctrineExtension.php +++ b/src/DependencyInjection/DoctrineExtension.php @@ -541,19 +541,22 @@ protected function ormLoad(array $config, ContainerBuilder $container) $controllerResolverDefaults['evict_cache'] = true; } - if ($controllerResolverDefaults) { - $container->getDefinition('doctrine.orm.entity_value_resolver')->setArgument(2, (new Definition(MapEntity::class))->setArguments([ - null, - null, - null, - $controllerResolverDefaults['mapping'] ?? null, - null, - null, - null, - $controllerResolverDefaults['evict_cache'] ?? null, - $controllerResolverDefaults['disabled'] ?? false, - ])); - } + $valueResolverDefinition = $container->getDefinition('doctrine.orm.entity_value_resolver'); + + $valueResolverDefinition->setArgument(2, (new Definition(MapEntity::class))->setArguments([ + null, + null, + null, + $controllerResolverDefaults['mapping'] ?? null, + null, + null, + null, + $controllerResolverDefaults['evict_cache'] ?? null, + $controllerResolverDefaults['disabled'] ?? false, + ])); + + // Symfony 7.2 and higher expose type alias support in the EntityValueResolver + $valueResolverDefinition->setArgument(3, $config['resolve_target_entities']); } // not available in Doctrine ORM 3.0 and higher diff --git a/tests/ContainerTest.php b/tests/ContainerTest.php index 54a6b26b3..e03154e8f 100644 --- a/tests/ContainerTest.php +++ b/tests/ContainerTest.php @@ -15,6 +15,7 @@ use Doctrine\ORM\Tools\Console\Command\SchemaTool\UpdateCommand; use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\Mapping\Driver\MappingDriverChain; +use Symfony\Bridge\Doctrine\ArgumentResolver\EntityValueResolver; use Symfony\Bridge\Doctrine\CacheWarmer\ProxyCacheWarmer; use Symfony\Bridge\Doctrine\DataCollector\DoctrineDataCollector; use Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor; @@ -23,6 +24,7 @@ use Symfony\Component\Cache\Adapter\ArrayAdapter; use Symfony\Component\Cache\Adapter\PhpArrayAdapter; +use function class_exists; use function interface_exists; class ContainerTest extends TestCase @@ -39,6 +41,10 @@ public function testContainer(): void $this->assertInstanceOf(Reader::class, $container->get('doctrine.orm.metadata.annotation_reader')); } + if (class_exists(EntityValueResolver::class)) { + $this->assertInstanceOf(EntityValueResolver::class, $container->get('doctrine.orm.entity_value_resolver')); + } + $this->assertInstanceOf(DoctrineDataCollector::class, $container->get('data_collector.doctrine')); $this->assertInstanceOf(DBALConfiguration::class, $container->get('doctrine.dbal.default_connection.configuration')); $this->assertInstanceOf(EventManager::class, $container->get('doctrine.dbal.default_connection.event_manager')); diff --git a/tests/DependencyInjection/DoctrineExtensionTest.php b/tests/DependencyInjection/DoctrineExtensionTest.php index f1d2f005e..116a23099 100644 --- a/tests/DependencyInjection/DoctrineExtensionTest.php +++ b/tests/DependencyInjection/DoctrineExtensionTest.php @@ -1497,13 +1497,29 @@ public function testControllerResolver(bool $simpleEntityManagerConfig): void $config['orm'] = []; } - $config['orm']['controller_resolver'] = ['auto_mapping' => true]; + $config['orm']['controller_resolver'] = ['auto_mapping' => true]; + $config['orm']['resolve_target_entities'] = ['Throwable' => 'stdClass']; $extension->load([$config], $container); $controllerResolver = $container->getDefinition('doctrine.orm.entity_value_resolver'); - $this->assertEquals([new Reference('doctrine'), new Reference('doctrine.orm.entity_value_resolver.expression_language', $container::IGNORE_ON_INVALID_REFERENCE)], $controllerResolver->getArguments()); + $this->assertEquals([ + 0 => new Reference('doctrine'), + 1 => new Reference('doctrine.orm.entity_value_resolver.expression_language', $container::IGNORE_ON_INVALID_REFERENCE), + 2 => (new Definition(MapEntity::class))->setArguments([ + null, + null, + null, + null, + null, + null, + null, + null, + false, + ]), + 3 => ['Throwable' => 'stdClass'], + ], $controllerResolver->getArguments()); $container = $this->getContainer();