diff --git a/config/orm.xml b/config/orm.xml index 2d808992..bb99ab6e 100644 --- a/config/orm.xml +++ b/config/orm.xml @@ -188,6 +188,11 @@ + + + + + diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index ba0fed1d..50f48a46 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -77,7 +77,7 @@ public function getConfigTreeBuilder(): TreeBuilder private function addDbalSection(ArrayNodeDefinition $node): void { // Key that should not be rewritten to the connection config - $excludedKeys = ['default_connection' => true, 'driver_schemes' => true, 'driver_scheme' => true, 'types' => true, 'type' => true]; + $excludedKeys = ['default_connection' => true, 'driver_schemes' => true, 'driver_scheme' => true, 'types' => true, 'type' => true, 'default_expression_modifier_injector' => true]; $node ->children() @@ -167,6 +167,11 @@ private function addDbalSection(ArrayNodeDefinition $node): void ->end() ->end() ->end() + ->children() + ->arrayNode('default_expression_modifier_injector')->scalarPrototype()->end() + ->beforeNormalization()->castToArray()->end() + ->end() + ->end() ->fixXmlConfig('connection') ->append($this->getDbalConnectionsNode()) ->end(); diff --git a/src/DependencyInjection/DoctrineExtension.php b/src/DependencyInjection/DoctrineExtension.php index 161626a7..ca75d750 100644 --- a/src/DependencyInjection/DoctrineExtension.php +++ b/src/DependencyInjection/DoctrineExtension.php @@ -33,6 +33,7 @@ use InvalidArgumentException; use LogicException; use Symfony\Bridge\Doctrine\ArgumentResolver\EntityValueResolver; +use Symfony\Bridge\Doctrine\ArgumentResolver\EntityValueResolverExpressionModifiersInjectorInterface; use Symfony\Bridge\Doctrine\Attribute\MapEntity; use Symfony\Bridge\Doctrine\DependencyInjection\AbstractDoctrineExtension; use Symfony\Bridge\Doctrine\IdGenerator\UlidGenerator; @@ -50,6 +51,7 @@ use Symfony\Component\Config\Definition\ConfigurationInterface; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\Alias; +use Symfony\Component\DependencyInjection\Attribute\AutowireLocator; use Symfony\Component\DependencyInjection\ChildDefinition; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Definition; @@ -87,6 +89,7 @@ * driver_schemes: array, * default_connection: string, * types: array, + * default_expression_modifier_injector: array * } */ class DoctrineExtension extends AbstractDoctrineExtension @@ -181,6 +184,7 @@ protected function dbalLoad(array $config, ContainerBuilder $container) $container->setAlias('doctrine.dbal.event_manager', new Alias(sprintf('doctrine.dbal.%s_connection.event_manager', $this->defaultConnection), false)); $container->setParameter('doctrine.dbal.connection_factory.types', $config['types']); + $container->setParameter('doctrine.dbal.default_expression_modifier_injector', $config['default_expression_modifier_injector']); $container->getDefinition('doctrine.dbal.connection_factory.dsn_parser')->setArgument(0, array_merge(ConnectionFactory::DEFAULT_SCHEME_MAP, $config['driver_schemes'])); @@ -496,7 +500,6 @@ protected function ormLoad(array $config, ContainerBuilder $container) // available in Symfony 6.2 and higher if (! class_exists(EntityValueResolver::class)) { $container->removeDefinition('doctrine.orm.entity_value_resolver'); - $container->removeDefinition('doctrine.orm.entity_value_resolver.expression_language'); } else { if (! class_exists(ExpressionLanguage::class)) { $container->removeDefinition('doctrine.orm.entity_value_resolver.expression_language'); @@ -533,6 +536,15 @@ protected function ormLoad(array $config, ContainerBuilder $container) $controllerResolverDefaults['evict_cache'] ?? null, $controllerResolverDefaults['disabled'] ?? false, ])); + } else { + $container->getDefinition('doctrine.orm.entity_value_resolver')->setArgument(2, (new Definition(MapEntity::class))); + } + + if (class_exists(ExpressionLanguage::class) && interface_exists(EntityValueResolverExpressionModifiersInjectorInterface::class)) { + /** @psalm-suppress UndefinedClass */ + $container->registerForAutoconfiguration(EntityValueResolverExpressionModifiersInjectorInterface::class)->addTag('doctrine.orm.entity_value_resolver_expression_modifier_injector'); + $container->getDefinition('doctrine.orm.entity_value_resolver')->setArgument(3, new AutowireLocator('doctrine.orm.entity_value_resolver_expression_modifier_injector', 'key')); + $container->getDefinition('doctrine.orm.entity_value_resolver')->setArgument(4, $container->getParameter('doctrine.dbal.default_expression_modifier_injector')); } } diff --git a/tests/DependencyInjection/DoctrineExtensionTest.php b/tests/DependencyInjection/DoctrineExtensionTest.php index b2a6e3c4..1c17e60d 100644 --- a/tests/DependencyInjection/DoctrineExtensionTest.php +++ b/tests/DependencyInjection/DoctrineExtensionTest.php @@ -1451,7 +1451,7 @@ public function testControllerResolver(bool $simpleEntityManagerConfig): void $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([new Reference('doctrine'), new Reference('doctrine.orm.entity_value_resolver.expression_language', $container::IGNORE_ON_INVALID_REFERENCE), new Definition(MapEntity::class)], $controllerResolver->getArguments()); $container = $this->getContainer();