|
187 | 187 | use Symfony\Component\Semaphore\Semaphore;
|
188 | 188 | use Symfony\Component\Semaphore\SemaphoreFactory;
|
189 | 189 | use Symfony\Component\Semaphore\Store\StoreFactory as SemaphoreStoreFactory;
|
| 190 | +use Symfony\Component\Serializer\Attribute as SerializerMapping; |
| 191 | +use Symfony\Component\Serializer\DependencyInjection\AttributeMetadataPass as SerializerAttributeMetadataPass; |
190 | 192 | use Symfony\Component\Serializer\Encoder\DecoderInterface;
|
191 | 193 | use Symfony\Component\Serializer\Encoder\EncoderInterface;
|
192 |
| -use Symfony\Component\Serializer\Mapping\Loader\AttributeLoader; |
193 | 194 | use Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader;
|
194 | 195 | use Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader;
|
195 | 196 | use Symfony\Component\Serializer\NameConverter\SnakeCaseToCamelCaseNameConverter;
|
@@ -2073,10 +2074,38 @@ private function registerSerializerConfiguration(array $config, ContainerBuilder
|
2073 | 2074 | }
|
2074 | 2075 |
|
2075 | 2076 | $serializerLoaders = [];
|
2076 |
| - if ($config['enable_attributes'] ?? false) { |
2077 |
| - $attributeLoader = new Definition(AttributeLoader::class); |
2078 | 2077 |
|
2079 |
| - $serializerLoaders[] = $attributeLoader; |
| 2078 | + // When attributes are disabled, it means from runtime-discovery only; autoconfiguration should still happen. |
| 2079 | + // And when runtime-discovery of attributes is enabled, we can skip compile-time autoconfiguration in debug mode. |
| 2080 | + if (class_exists(SerializerAttributeMetadataPass::class) && (!($config['enable_attributes'] ?? false) || !$container->getParameter('kernel.debug'))) { |
| 2081 | + // The $reflector argument hints at where the attribute could be used |
| 2082 | + $configurator = function (ChildDefinition $definition, object $attribute, \ReflectionClass|\ReflectionMethod|\ReflectionProperty $reflector) { |
| 2083 | + $definition->addTag('serializer.attribute_metadata'); |
| 2084 | + }; |
| 2085 | + $container->registerAttributeForAutoconfiguration(SerializerMapping\Context::class, $configurator); |
| 2086 | + $container->registerAttributeForAutoconfiguration(SerializerMapping\Groups::class, $configurator); |
| 2087 | + |
| 2088 | + $configurator = function (ChildDefinition $definition, object $attribute, \ReflectionMethod|\ReflectionProperty $reflector) { |
| 2089 | + $definition->addTag('serializer.attribute_metadata'); |
| 2090 | + }; |
| 2091 | + $container->registerAttributeForAutoconfiguration(SerializerMapping\Ignore::class, $configurator); |
| 2092 | + $container->registerAttributeForAutoconfiguration(SerializerMapping\MaxDepth::class, $configurator); |
| 2093 | + $container->registerAttributeForAutoconfiguration(SerializerMapping\SerializedName::class, $configurator); |
| 2094 | + $container->registerAttributeForAutoconfiguration(SerializerMapping\SerializedPath::class, $configurator); |
| 2095 | + |
| 2096 | + $container->registerAttributeForAutoconfiguration(SerializerMapping\DiscriminatorMap::class, function (ChildDefinition $definition) { |
| 2097 | + $definition->addTag('serializer.attribute_metadata'); |
| 2098 | + }); |
| 2099 | + } |
| 2100 | + |
| 2101 | + if (($config['enable_attributes'] ?? false) || class_exists(SerializerAttributeMetadataPass::class)) { |
| 2102 | + $serializerLoaders[] = new Reference('serializer.mapping.attribute_loader'); |
| 2103 | + |
| 2104 | + $container->getDefinition('serializer.mapping.attribute_loader') |
| 2105 | + ->replaceArgument(0, $config['enable_attributes'] ?? false); |
| 2106 | + } else { |
| 2107 | + // BC with symfony/serializer < 7.4 |
| 2108 | + $container->removeDefinition('serializer.mapping.attribute_services_loader'); |
2080 | 2109 | }
|
2081 | 2110 |
|
2082 | 2111 | $fileRecorder = function ($extension, $path) use (&$serializerLoaders) {
|
|
0 commit comments