Skip to content

Commit

Permalink
Wire up type aliases support in EntityValueResolver
Browse files Browse the repository at this point in the history
This is an addendum to PR symfony/symfony#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.
  • Loading branch information
NanoSector committed Apr 11, 2024
1 parent 6c058a8 commit f748096
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 1 deletion.
17 changes: 17 additions & 0 deletions src/DependencyInjection/DoctrineExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
use Doctrine\Persistence\Reflection\RuntimeReflectionProperty;
use InvalidArgumentException;
use LogicException;
use ReflectionClass;
use Symfony\Bridge\Doctrine\ArgumentResolver\EntityValueResolver;
use Symfony\Bridge\Doctrine\Attribute\MapEntity;
use Symfony\Bridge\Doctrine\DependencyInjection\AbstractDoctrineExtension;
Expand Down Expand Up @@ -625,6 +626,22 @@ protected function ormLoad(array $config, ContainerBuilder $container)
$def
->addTag('doctrine.event_listener', ['event' => Events::loadClassMetadata])
->addTag('doctrine.event_listener', ['event' => Events::onClassMetadataNotFound]);

// Symfony 7.1 and higher expose type alias support in the EntityValueResolver
if (class_exists(EntityValueResolver::class)) {
$valueResolverReflection = new ReflectionClass(EntityValueResolver::class);

if ($valueResolverReflection->hasMethod('addTypeAlias')) {
$valueResolverDefinition = $container->getDefinition('doctrine.orm.entity_value_resolver');

foreach ($config['resolve_target_entities'] as $name => $implementation) {
$valueResolverDefinition->addMethodCall('addTypeAlias', [
$name,
$implementation,
]);
}
}
}
}

$container->registerForAutoconfiguration(ServiceEntityRepositoryInterface::class)
Expand Down
6 changes: 6 additions & 0 deletions tests/ContainerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand All @@ -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'));
Expand Down
13 changes: 12 additions & 1 deletion tests/DependencyInjection/DoctrineExtensionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
use LogicException;
use PHPUnit\Framework\TestCase;
use ReflectionClass;
use Symfony\Bridge\Doctrine\ArgumentResolver\EntityValueResolver;
use Symfony\Bridge\Doctrine\Attribute\MapEntity;
use Symfony\Bridge\Doctrine\Messenger\DoctrineClearEntityManagerWorkerSubscriber;
use Symfony\Component\Cache\Adapter\ArrayAdapter;
Expand Down Expand Up @@ -1445,14 +1446,24 @@ 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());

$resolverReflection = new ReflectionClass(EntityValueResolver::class);
$calls = $controllerResolver->getMethodCalls();

if ($resolverReflection->hasMethod('addTypeAlias')) {
self::assertEquals([['addTypeAlias', ['Throwable', 'stdClass']]], $calls);
} else {
self::assertEmpty($calls);
}

$container = $this->getContainer();

$config['orm']['controller_resolver'] = [
Expand Down

0 comments on commit f748096

Please sign in to comment.