Skip to content

Commit 13ab18d

Browse files
committed
Wire the Console EntityValueResolver as a service
1 parent 0ff098b commit 13ab18d

File tree

4 files changed

+94
-3
lines changed

4 files changed

+94
-3
lines changed

config/orm.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
use Doctrine\Persistence\Mapping\Driver\MappingDriverChain;
4949
use Doctrine\Persistence\Mapping\Driver\PHPDriver;
5050
use Doctrine\Persistence\Mapping\Driver\StaticPHPDriver;
51+
use Symfony\Bridge\Doctrine\ArgumentResolver\Console\EntityValueResolver as ConsoleEntityValueResolver;
5152
use Symfony\Bridge\Doctrine\ArgumentResolver\EntityValueResolver;
5253
use Symfony\Bridge\Doctrine\CacheWarmer\ProxyCacheWarmer;
5354
use Symfony\Bridge\Doctrine\Form\DoctrineOrmTypeGuesser;
@@ -267,6 +268,13 @@
267268
])
268269
->tag('controller.argument_value_resolver', ['priority' => 110, 'name' => EntityValueResolver::class])
269270

271+
->set('doctrine.orm.entity_value_resolver.console', ConsoleEntityValueResolver::class)
272+
->args([
273+
service('doctrine'),
274+
service('doctrine.orm.entity_value_resolver.expression_language')->ignoreOnInvalid(),
275+
])
276+
->tag('console.argument_value_resolver', ['priority' => 110, 'name' => ConsoleEntityValueResolver::class])
277+
270278
->set('doctrine.orm.entity_value_resolver.expression_language', ExpressionLanguage::class)
271279

272280
->set('doctrine.cache_clear_metadata_command', MetadataCommand::class)

src/DependencyInjection/DoctrineExtension.php

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
use InvalidArgumentException;
4949
use LogicException;
5050
use ReflectionClass;
51+
use Symfony\Bridge\Doctrine\ArgumentResolver\Console\EntityValueResolver;
5152
use Symfony\Bridge\Doctrine\Attribute\MapEntity;
5253
use Symfony\Bridge\Doctrine\IdGenerator\UlidGenerator;
5354
use Symfony\Bridge\Doctrine\IdGenerator\UuidGenerator;
@@ -946,8 +947,8 @@ protected function ormLoad(array $config, ContainerBuilder $container)
946947
$controllerResolverDefaults['evict_cache'] = true;
947948
}
948949

949-
$valueResolverDefinition = $container->getDefinition('doctrine.orm.entity_value_resolver');
950-
$valueResolverDefinition->setArgument(2, (new Definition(MapEntity::class))->setArguments([
950+
$controllerValueResolverDefinition = $container->getDefinition('doctrine.orm.entity_value_resolver');
951+
$controllerValueResolverDefinition->setArgument(2, (new Definition(MapEntity::class))->setArguments([
951952
null,
952953
null,
953954
null,
@@ -960,7 +961,27 @@ protected function ormLoad(array $config, ContainerBuilder $container)
960961
]));
961962

962963
// Symfony 7.3 and higher expose type alias support in the EntityValueResolver
963-
$valueResolverDefinition->setArgument(3, $config['resolve_target_entities']);
964+
$controllerValueResolverDefinition->setArgument(3, $config['resolve_target_entities']);
965+
966+
// The Console EntityValueResolver is available in Symfony 8.1 and higher
967+
if (class_exists(EntityValueResolver::class)) {
968+
$consoleValueResolverDefinition = $container->getDefinition('doctrine.orm.entity_value_resolver.console');
969+
$consoleValueResolverDefinition->setArgument(2, (new Definition(MapEntity::class))->setArguments([
970+
null,
971+
null,
972+
null,
973+
$controllerResolverDefaults['mapping'] ?? null,
974+
null,
975+
null,
976+
null,
977+
$controllerResolverDefaults['evict_cache'] ?? null,
978+
$controllerResolverDefaults['disabled'] ?? false,
979+
]));
980+
981+
$consoleValueResolverDefinition->setArgument(3, $config['resolve_target_entities']);
982+
} else {
983+
$container->removeDefinition('doctrine.orm.entity_value_resolver.console');
984+
}
964985

965986
// not available in Doctrine ORM 3.0 and higher
966987
if (! class_exists(ConvertMappingCommand::class)) {

tests/ContainerTest.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Doctrine\ORM\Tools\Console\Command\SchemaTool\UpdateCommand;
1919
use Doctrine\Persistence\ManagerRegistry;
2020
use Doctrine\Persistence\Mapping\Driver\MappingDriverChain;
21+
use Symfony\Bridge\Doctrine\ArgumentResolver\Console\EntityValueResolver as ConsoleEntityValueResolver;
2122
use Symfony\Bridge\Doctrine\ArgumentResolver\EntityValueResolver;
2223
use Symfony\Bridge\Doctrine\CacheWarmer\ProxyCacheWarmer;
2324
use Symfony\Bridge\Doctrine\DataCollector\DoctrineDataCollector;
@@ -48,6 +49,10 @@ public function testContainer(): void
4849
$this->assertInstanceOf(EntityValueResolver::class, $container->get('doctrine.orm.entity_value_resolver'));
4950
}
5051

52+
if (class_exists(ConsoleEntityValueResolver::class)) {
53+
$this->assertInstanceOf(ConsoleEntityValueResolver::class, $container->get('doctrine.orm.entity_value_resolver.console'));
54+
}
55+
5156
$this->assertInstanceOf(DoctrineDataCollector::class, $container->get('data_collector.doctrine'));
5257
$this->assertInstanceOf(DBALConfiguration::class, $container->get('doctrine.dbal.default_connection.configuration'));
5358
$this->assertInstanceOf(EventManager::class, $container->get('doctrine.dbal.default_connection.event_manager'));

tests/DependencyInjection/DoctrineExtensionTest.php

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
use PHPUnit\Framework\Attributes\TestWith;
4848
use PHPUnit\Framework\TestCase;
4949
use ReflectionClass;
50+
use Symfony\Bridge\Doctrine\ArgumentResolver\Console\EntityValueResolver as ConsoleEntityValueResolver;
5051
use Symfony\Bridge\Doctrine\ArgumentResolver\EntityValueResolver;
5152
use Symfony\Bridge\Doctrine\Attribute\MapEntity;
5253
use Symfony\Bridge\Doctrine\Middleware\IdleConnection\Driver;
@@ -1507,6 +1508,62 @@ public function testControllerResolver(bool $simpleEntityManagerConfig): void
15071508
$this->assertEquals(new MapEntity(null, null, null, [], null, null, null, true, true), $container->get('controller_resolver_defaults'));
15081509
}
15091510

1511+
#[IgnoreDeprecations]
1512+
#[RequiresMethod(ConsoleEntityValueResolver::class, '__construct')]
1513+
#[TestWith([true])]
1514+
#[TestWith([false])]
1515+
public function testConsoleCommandResolver(bool $simpleEntityManagerConfig): void
1516+
{
1517+
if (! interface_exists(EntityManagerInterface::class)) {
1518+
self::markTestSkipped('This test requires ORM');
1519+
}
1520+
1521+
$container = $this->getContainer();
1522+
$extension = new DoctrineExtension();
1523+
$config = BundleConfigurationBuilder::createBuilderWithBaseValues()->build();
1524+
1525+
if ($simpleEntityManagerConfig) {
1526+
$config['orm'] = [];
1527+
}
1528+
1529+
$config['orm']['controller_resolver'] = ['auto_mapping' => true];
1530+
$config['orm']['resolve_target_entities'] = ['Throwable' => 'stdClass'];
1531+
1532+
$extension->load([DeprecationFreeConfig::get(), $config], $container);
1533+
1534+
$controllerResolver = $container->getDefinition('doctrine.orm.entity_value_resolver.console');
1535+
1536+
$this->assertEquals([
1537+
0 => new Reference('doctrine'),
1538+
1 => new Reference('doctrine.orm.entity_value_resolver.expression_language', $container::IGNORE_ON_INVALID_REFERENCE),
1539+
2 => (new Definition(MapEntity::class))->setArguments([
1540+
null,
1541+
null,
1542+
null,
1543+
null,
1544+
null,
1545+
null,
1546+
null,
1547+
null,
1548+
false,
1549+
]),
1550+
3 => ['Throwable' => 'stdClass'],
1551+
], $controllerResolver->getArguments());
1552+
1553+
$container = $this->getContainer();
1554+
1555+
$config['orm']['controller_resolver'] = [
1556+
'enabled' => false,
1557+
'auto_mapping' => false,
1558+
'evict_cache' => true,
1559+
];
1560+
$extension->load([$config], $container);
1561+
1562+
$container->setDefinition('controller_resolver_defaults', $container->getDefinition('doctrine.orm.entity_value_resolver.console')->getArgument(2))->setPublic(true);
1563+
$container->compile();
1564+
$this->assertEquals(new MapEntity(null, null, null, [], null, null, null, true, true), $container->get('controller_resolver_defaults'));
1565+
}
1566+
15101567
#[TestWith(['AnnotationsBundle', 'attribute', 'Vendor'], 'Bundle without anything')]
15111568
#[TestWith(['AttributesBundle', 'attribute'], 'Bundle with attributes')]
15121569
#[TestWith(['RepositoryServiceBundle', 'attribute'], 'Bundle with both')]

0 commit comments

Comments
 (0)