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();