From 1c93c73761d1879ad0cab0773f620a94b1732535 Mon Sep 17 00:00:00 2001 From: Joel Wurtz Date: Thu, 20 Jun 2024 09:41:16 +0200 Subject: [PATCH 1/2] feat(symfony): remove useless pass for property info, remove cache --- src/Symfony/Bundle/AutoMapperBundle.php | 2 - .../AutoMapperExtension.php | 7 ++ .../Compiler/PropertyInfoPass.php | 87 ------------------- .../Bundle/Resources/config/property_info.php | 34 ++++++++ 4 files changed, 41 insertions(+), 89 deletions(-) delete mode 100644 src/Symfony/Bundle/DependencyInjection/Compiler/PropertyInfoPass.php create mode 100644 src/Symfony/Bundle/Resources/config/property_info.php diff --git a/src/Symfony/Bundle/AutoMapperBundle.php b/src/Symfony/Bundle/AutoMapperBundle.php index 1fcedf35..da032075 100644 --- a/src/Symfony/Bundle/AutoMapperBundle.php +++ b/src/Symfony/Bundle/AutoMapperBundle.php @@ -5,7 +5,6 @@ namespace AutoMapper\Symfony\Bundle; use AutoMapper\Symfony\Bundle\DependencyInjection\AutoMapperExtension; -use AutoMapper\Symfony\Bundle\DependencyInjection\Compiler\PropertyInfoPass; use AutoMapper\Symfony\Bundle\DependencyInjection\Compiler\TransformerFactoryPass; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\ExtensionInterface; @@ -17,7 +16,6 @@ public function build(ContainerBuilder $container): void { parent::build($container); - $container->addCompilerPass(new PropertyInfoPass()); $container->addCompilerPass(new TransformerFactoryPass()); } diff --git a/src/Symfony/Bundle/DependencyInjection/AutoMapperExtension.php b/src/Symfony/Bundle/DependencyInjection/AutoMapperExtension.php index a26b92a7..63f9f25d 100644 --- a/src/Symfony/Bundle/DependencyInjection/AutoMapperExtension.php +++ b/src/Symfony/Bundle/DependencyInjection/AutoMapperExtension.php @@ -25,6 +25,7 @@ use Symfony\Component\DependencyInjection\Extension\Extension; use Symfony\Component\DependencyInjection\Loader\PhpFileLoader; use Symfony\Component\DependencyInjection\Reference; +use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use Symfony\Component\Serializer\SerializerInterface; use Symfony\Component\Uid\AbstractUid; @@ -53,6 +54,7 @@ public function load(array $configs, ContainerBuilder $container): void $loader->load('expression_language.php'); $loader->load('generator.php'); $loader->load('metadata.php'); + $loader->load('property_info.php'); $loader->load('provider.php'); $loader->load('symfony.php'); $loader->load('transformers.php'); @@ -67,6 +69,11 @@ public function load(array $configs, ContainerBuilder $container): void ->setArgument('$allowReadOnlyTargetToPopulate', $config['allow_readonly_target_to_populate']) ; + if ($config['map_private_properties']) { + $container->getDefinition('automapper.property_info.reflection_extractor') + ->replaceArgument('$accessFlags', ReflectionExtractor::ALLOW_PUBLIC | ReflectionExtractor::ALLOW_PRIVATE | ReflectionExtractor::ALLOW_PROTECTED); + } + $container->setParameter('automapper.map_private_properties', $config['map_private_properties']); $container->registerForAutoconfiguration(PropertyTransformerInterface::class)->addTag('automapper.property_transformer'); diff --git a/src/Symfony/Bundle/DependencyInjection/Compiler/PropertyInfoPass.php b/src/Symfony/Bundle/DependencyInjection/Compiler/PropertyInfoPass.php deleted file mode 100644 index 3237bcb2..00000000 --- a/src/Symfony/Bundle/DependencyInjection/Compiler/PropertyInfoPass.php +++ /dev/null @@ -1,87 +0,0 @@ -has('property_info')) { - return; - } - - $flags = ReflectionExtractor::ALLOW_PUBLIC; - - if ($container->getParameter('automapper.map_private_properties')) { - $flags |= ReflectionExtractor::ALLOW_PRIVATE | ReflectionExtractor::ALLOW_PROTECTED; - } - - $container->setDefinition( - 'automapper.property_info.reflection_extractor', - new Definition( - ReflectionExtractor::class, - [ - '$mutatorPrefixes' => null, - '$accessorPrefixes' => null, - '$arrayMutatorPrefixes' => null, - '$enableConstructorExtraction' => true, - '$accessFlags' => $flags, - ] - ) - ); - - $container->setDefinition( - 'automapper.property_info.read_write_type_extractor', - new Definition( - ReadWriteTypeExtractor::class, - [] - ) - ); - - $container->setDefinition( - 'automapper.property_info', - new Definition( - PropertyInfoExtractor::class, - [ - new IteratorArgument([ - new Reference('automapper.property_info.reflection_extractor'), - ]), - new IteratorArgument([ - new Reference('automapper.property_info.read_write_type_extractor'), - new Reference('property_info.phpstan_extractor'), - new Reference('automapper.property_info.reflection_extractor'), - ]), - new IteratorArgument([ - new Reference('automapper.property_info.reflection_extractor'), - ]), - new IteratorArgument([ - new Reference('automapper.property_info.reflection_extractor'), - ]), - new IteratorArgument([ - new Reference('automapper.property_info.reflection_extractor'), - ]), - ] - ) - ); - - $container->setDefinition( - 'automapper.property_info.cache', - new Definition(PropertyInfoCacheExtractor::class, [ - new Reference('.inner'), - new Reference('cache.property_info'), - ]) - )->setDecoratedService('automapper.property_info'); - } -} diff --git a/src/Symfony/Bundle/Resources/config/property_info.php b/src/Symfony/Bundle/Resources/config/property_info.php new file mode 100644 index 00000000..733ecdca --- /dev/null +++ b/src/Symfony/Bundle/Resources/config/property_info.php @@ -0,0 +1,34 @@ +services() + ->set('automapper.property_info.reflection_extractor', ReflectionExtractor::class) + ->args([ + '$mutatorPrefixes' => null, + '$accessorPrefixes' => null, + '$arrayMutatorPrefixes' => null, + '$enableConstructorExtraction' => true, + '$accessFlags' => ReflectionExtractor::ALLOW_PUBLIC, + ]) + ->set('automapper.property_info.read_write_type_extractor', ReadWriteTypeExtractor::class) + ->set('automapper.property_info.phpstan_extractor', PhpStanExtractor::class) + ->set('automapper.property_info', PropertyInfoExtractor::class) + ->args([ + [service('automapper.property_info.reflection_extractor')], + [service('automapper.property_info.read_write_type_extractor'), service('automapper.property_info.phpstan_extractor'), service('automapper.property_info.reflection_extractor')], + [service('automapper.property_info.reflection_extractor')], + [service('automapper.property_info.reflection_extractor')], + [service('automapper.property_info.reflection_extractor')], + ]) + ; +}; From 8fc007f1a4d284e42941c0654646147ce7bf8621 Mon Sep 17 00:00:00 2001 From: Joel Wurtz Date: Thu, 20 Jun 2024 14:23:35 +0200 Subject: [PATCH 2/2] chore(changelog): add line about property info changes --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3868f571..a00ff518 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Fixed +- [GH#166](https://github.com/jolicode/automapper/pull/166) Remove cache for property info, use specific services instead ## [9.1.1] - 2024-06-19 ### Fixed