From 35d0ce8bb3a239e555cbb62ec15194905e243ea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Thu, 25 Dec 2014 04:17:33 +0100 Subject: [PATCH 1/5] [FrameworkBundle] Serializer groups support --- .../DependencyInjection/Configuration.php | 4 + .../FrameworkExtension.php | 76 ++++++++++++++++++- .../Resources/config/schema/symfony-1.0.xsd | 7 ++ .../Resources/config/serializer.xml | 13 ++++ .../DependencyInjection/ConfigurationTest.php | 1 + .../DependencyInjection/Fixtures/php/full.php | 1 + .../DependencyInjection/Fixtures/xml/full.xml | 1 + .../DependencyInjection/Fixtures/yml/full.yml | 1 + .../FrameworkExtensionTest.php | 12 +++ 9 files changed, 113 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php index e544df9282030..5e6c9a4176aad 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php @@ -660,6 +660,10 @@ private function addSerializerSection(ArrayNodeDefinition $rootNode) ->arrayNode('serializer') ->info('serializer configuration') ->canBeEnabled() + ->children() + ->booleanNode('enable_annotations')->defaultFalse()->end() + ->scalarNode('cache')->end() + ->end() ->end() ->end() ; diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 5755dbe4f814f..c2bddb267f8e7 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -13,6 +13,7 @@ use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\DefinitionDecorator; use Symfony\Component\DependencyInjection\Exception\LogicException; use Symfony\Component\DependencyInjection\Reference; @@ -29,6 +30,7 @@ * * @author Fabien Potencier * @author Jeremy Mikola + * @author Kévin Dunglas */ class FrameworkExtension extends Extension { @@ -121,11 +123,10 @@ public function load(array $configs, ContainerBuilder $container) } $this->registerAnnotationsConfiguration($config['annotations'], $container, $loader); - $this->registerPropertyAccessConfiguration($config['property_access'], $container); - if (isset($config['serializer']) && $config['serializer']['enabled']) { - $loader->load('serializer.xml'); + if (isset($config['serializer'])) { + $this->registerSerializerConfiguration($config['serializer'], $container, $loader); } $loader->load('debug_prod.xml'); @@ -866,6 +867,75 @@ private function registerSecurityCsrfConfiguration(array $config, ContainerBuild $loader->load('security_csrf.xml'); } + /** + * Loads the serializer configuration. + * + * @param array $config A serializer configuration array + * @param ContainerBuilder $container A ContainerBuilder instance + * @param XmlFileLoader $loader An XmlFileLoader instance + */ + private function registerSerializerConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader) + { + if (!$config['enabled']) { + return; + } + + $loader->load('serializer.xml'); + $chainLoader = $container->getDefinition('serializer.mapping.chain_loader'); + + $serializerLoaders = array(); + if (isset($config['enable_annotations']) && $config['enable_annotations']) { + $annotationLoader = new Definition( + 'Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader', + array(new Reference('annotation_reader')) + ); + $annotationLoader->setPublic(false); + + $serializerLoaders[] = $annotationLoader; + } + + $bundles = $container->getParameter('kernel.bundles'); + foreach ($bundles as $bundle) { + $reflection = new \ReflectionClass($bundle); + $dirname = dirname($reflection->getFilename()); + + if (is_file($file = $dirname.'/Resources/config/serialization.xml')) { + $definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader', array(realpath($file))); + $definition->setPublic(false); + + $serializerLoaders[] = $definition; + $container->addResource(new FileResource($file)); + } + + if (is_file($file = $dirname.'/Resources/config/serialization.yml')) { + $definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader', array(realpath($file))); + $definition->setPublic(false); + + $serializerLoaders[] = $definition; + $container->addResource(new FileResource($file)); + } + } + + $chainLoader->replaceArgument(0, $serializerLoaders); + + if (isset($config['cache']) && $config['cache'] !== 'none') { + $container->setParameter( + 'serializer.mapping.cache.prefix', + 'serializer_'.hash('sha256', $container->getParameter('kernel.root_dir')) + ); + + if ($config['cache'] === 'apc') { + $apcCacheDefinition = $container->register('serializer.mapping.cache.apc', 'Doctrine\Common\Cache\ApcCache'); + $apcCacheDefinition->addMethodCall('setNamespace', array('%serializer.mapping.cache.prefix%')); + $apcCacheDefinition->setPublic(false); + } + + $container->getDefinition('serializer.mapping.class_metadata_factory')->replaceArgument( + 1, new Reference('serializer.mapping.cache.'.$config['cache']) + ); + } + } + /** * Returns the base path for the XSD files. * diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd b/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd index 652d168a77266..fa7aa2b2bd808 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd @@ -32,6 +32,7 @@ + @@ -210,4 +211,10 @@ + + + + + + diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.xml index 90a9ec251041f..9ced0481dee21 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.xml @@ -18,10 +18,23 @@ + + + + + + + + + + + null + + diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php index 1cef379eeb5e7..7042408e78161 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php @@ -161,6 +161,7 @@ protected static function getBundleDefaultConfig() ), 'serializer' => array( 'enabled' => false, + 'enable_annotations' => false, ), 'property_access' => array( 'magic_call' => false, diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/full.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/full.php index 679da4161d4fd..5022aeaf9f207 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/full.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/full.php @@ -60,6 +60,7 @@ 'debug' => true, 'file_cache_dir' => '%kernel.cache_dir%/annotations', ), + 'serializer' => array('enabled' => true), 'ide' => 'file%%link%%format', 'request' => array( 'formats' => array( diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/full.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/full.xml index 4f41288410e0c..5b16a59796091 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/full.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/full.xml @@ -37,5 +37,6 @@ + diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/full.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/full.yml index 3fd70b7eba38e..be1b41e25f894 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/full.yml +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/full.yml @@ -46,6 +46,7 @@ framework: cache: file debug: true file_cache_dir: %kernel.cache_dir%/annotations + serializer: { enabled: true } ide: file%%link%%format request: formats: diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php index 8fa733579e3a2..6cceba1290275 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php @@ -498,6 +498,18 @@ public function testStopwatchEnabledWithDebugModeDisabled() $this->assertTrue($container->has('debug.stopwatch')); } + public function testSerializerDisabled() + { + $container = $this->createContainerFromFile('default_config'); + $this->assertFalse($container->has('serializer')); + } + + public function testSerializerEnabled() + { + $container = $this->createContainerFromFile('full'); + $this->assertTrue($container->has('serializer')); + } + protected function createContainer(array $data = array()) { return new ContainerBuilder(new ParameterBag(array_merge(array( From 290d50b8aa2c55567143ee4ddca81e29d6a89765 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Tue, 3 Mar 2015 16:07:48 +0100 Subject: [PATCH 2/5] [FrameworkBundle] Make ObjectNormalizer default --- .../Bundle/FrameworkBundle/Resources/config/serializer.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.xml index 9ced0481dee21..8846e582aa451 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.xml @@ -17,7 +17,7 @@ - + From 3ee6fbaa42fb7927f3258559fdc8336d635ee01b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Tue, 10 Mar 2015 20:51:28 +0100 Subject: [PATCH 3/5] [FrameworkBundle] Read serialization mapping form Resources/config/serialization/ sub-dir --- .../DependencyInjection/FrameworkExtension.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index c2bddb267f8e7..c77c278d27ad2 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -914,6 +914,23 @@ private function registerSerializerConfiguration(array $config, ContainerBuilder $serializerLoaders[] = $definition; $container->addResource(new FileResource($file)); } + + if (is_dir($dir = $dirname.'/Resources/config/serialization')) { + foreach (Finder::create()->files()->in($dir)->name('*.xml') as $file) { + $definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader', array($file->getRealpath())); + $definition->setPublic(false); + + $serializerLoaders[] = $definition; + } + foreach (Finder::create()->files()->in($dir)->name('*.yml') as $file) { + $definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader', array($file->getRealpath())); + $definition->setPublic(false); + + $serializerLoaders[] = $definition; + } + + $container->addResource(new DirectoryResource($dir)); + } } $chainLoader->replaceArgument(0, $serializerLoaders); From 3d39c1f529f91f78e3e32b22ac08463ea05b791f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Tue, 10 Mar 2015 20:54:55 +0100 Subject: [PATCH 4/5] [FrameworkBundle] Serializer: remove none value support --- .../FrameworkBundle/DependencyInjection/FrameworkExtension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index c77c278d27ad2..9718d9095adf2 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -935,7 +935,7 @@ private function registerSerializerConfiguration(array $config, ContainerBuilder $chainLoader->replaceArgument(0, $serializerLoaders); - if (isset($config['cache']) && $config['cache'] !== 'none') { + if (isset($config['cache']) && $config['cache']) { $container->setParameter( 'serializer.mapping.cache.prefix', 'serializer_'.hash('sha256', $container->getParameter('kernel.root_dir')) From 01c83667761ad20b06e397ef55682a81cc9b38c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Tue, 10 Mar 2015 21:13:52 +0100 Subject: [PATCH 5/5] [FrameworkBundle] Serializer: support service name for cache --- .../DependencyInjection/FrameworkExtension.php | 8 +------- .../FrameworkBundle/Resources/config/serializer.xml | 7 +++++++ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 9718d9095adf2..a672fd8b0acf0 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -941,14 +941,8 @@ private function registerSerializerConfiguration(array $config, ContainerBuilder 'serializer_'.hash('sha256', $container->getParameter('kernel.root_dir')) ); - if ($config['cache'] === 'apc') { - $apcCacheDefinition = $container->register('serializer.mapping.cache.apc', 'Doctrine\Common\Cache\ApcCache'); - $apcCacheDefinition->addMethodCall('setNamespace', array('%serializer.mapping.cache.prefix%')); - $apcCacheDefinition->setPublic(false); - } - $container->getDefinition('serializer.mapping.class_metadata_factory')->replaceArgument( - 1, new Reference('serializer.mapping.cache.'.$config['cache']) + 1, new Reference($config['cache']) ); } } diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.xml index 8846e582aa451..e4dd1306675d2 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.xml @@ -35,6 +35,13 @@ null + + + + %serializer.mapping.cache.prefix% + + +