From 0a71f6ee96fb56508434984b5fcca7205f11338b Mon Sep 17 00:00:00 2001 From: eltharin Date: Fri, 12 Jul 2024 13:17:08 +0200 Subject: [PATCH 1/2] service EntityValueResolver Changes Service Definition change for allow user inject its own variables in EntityValueResolver Symfony review change : EntityValueResolverVariableInjector to UserInjector --- config/orm.xml | 4 ++++ src/DependencyInjection/DoctrineExtension.php | 7 +++++++ tests/DependencyInjection/DoctrineExtensionTest.php | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/config/orm.xml b/config/orm.xml index 2d8089926..d19ec16d1 100644 --- a/config/orm.xml +++ b/config/orm.xml @@ -188,6 +188,10 @@ + + + + diff --git a/src/DependencyInjection/DoctrineExtension.php b/src/DependencyInjection/DoctrineExtension.php index 161626a7a..78bd172eb 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\UserInjector; use Symfony\Bridge\Doctrine\Attribute\MapEntity; use Symfony\Bridge\Doctrine\DependencyInjection\AbstractDoctrineExtension; use Symfony\Bridge\Doctrine\IdGenerator\UlidGenerator; @@ -533,6 +534,12 @@ 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) && class_exists(UserInjector::class)) { + $container->getDefinition('doctrine.orm.entity_value_resolver')->setArgument(3, new Reference('doctrine.orm.entity_value_resolver_variable_injector')); } } diff --git a/tests/DependencyInjection/DoctrineExtensionTest.php b/tests/DependencyInjection/DoctrineExtensionTest.php index b2a6e3c4e..1c17e60df 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(); From b856ad06863916dac2be66757a205c7189d35b5c Mon Sep 17 00:00:00 2001 From: eltharin Date: Sat, 13 Jul 2024 16:34:56 +0200 Subject: [PATCH 2/2] update for Expression Modifier Injector correct psalm --- config/orm.xml | 3 ++- src/DependencyInjection/Configuration.php | 7 ++++++- src/DependencyInjection/DoctrineExtension.php | 13 +++++++++---- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/config/orm.xml b/config/orm.xml index d19ec16d1..bb99ab6e6 100644 --- a/config/orm.xml +++ b/config/orm.xml @@ -188,8 +188,9 @@ - + + diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index ba0fed1d7..50f48a46e 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 78bd172eb..ca75d750d 100644 --- a/src/DependencyInjection/DoctrineExtension.php +++ b/src/DependencyInjection/DoctrineExtension.php @@ -33,7 +33,7 @@ use InvalidArgumentException; use LogicException; use Symfony\Bridge\Doctrine\ArgumentResolver\EntityValueResolver; -use Symfony\Bridge\Doctrine\ArgumentResolver\UserInjector; +use Symfony\Bridge\Doctrine\ArgumentResolver\EntityValueResolverExpressionModifiersInjectorInterface; use Symfony\Bridge\Doctrine\Attribute\MapEntity; use Symfony\Bridge\Doctrine\DependencyInjection\AbstractDoctrineExtension; use Symfony\Bridge\Doctrine\IdGenerator\UlidGenerator; @@ -51,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; @@ -88,6 +89,7 @@ * driver_schemes: array, * default_connection: string, * types: array, + * default_expression_modifier_injector: array * } */ class DoctrineExtension extends AbstractDoctrineExtension @@ -182,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'])); @@ -497,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'); @@ -538,8 +540,11 @@ protected function ormLoad(array $config, ContainerBuilder $container) $container->getDefinition('doctrine.orm.entity_value_resolver')->setArgument(2, (new Definition(MapEntity::class))); } - if (class_exists(ExpressionLanguage::class) && class_exists(UserInjector::class)) { - $container->getDefinition('doctrine.orm.entity_value_resolver')->setArgument(3, new Reference('doctrine.orm.entity_value_resolver_variable_injector')); + 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')); } }