Skip to content

Commit 2c425cc

Browse files
dunglasfabpot
authored andcommitted
[FrameworkBundle] Serializer groups support
1 parent 8f1d4a8 commit 2c425cc

File tree

9 files changed

+132
-4
lines changed

9 files changed

+132
-4
lines changed

DependencyInjection/Configuration.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,10 @@ private function addSerializerSection(ArrayNodeDefinition $rootNode)
660660
->arrayNode('serializer')
661661
->info('serializer configuration')
662662
->canBeEnabled()
663+
->children()
664+
->booleanNode('enable_annotations')->defaultFalse()->end()
665+
->scalarNode('cache')->end()
666+
->end()
663667
->end()
664668
->end()
665669
;

DependencyInjection/FrameworkExtension.php

Lines changed: 84 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Symfony\Component\DependencyInjection\ContainerBuilder;
1515
use Symfony\Component\DependencyInjection\ContainerInterface;
16+
use Symfony\Component\DependencyInjection\Definition;
1617
use Symfony\Component\DependencyInjection\DefinitionDecorator;
1718
use Symfony\Component\DependencyInjection\Exception\LogicException;
1819
use Symfony\Component\DependencyInjection\Reference;
@@ -29,6 +30,7 @@
2930
*
3031
* @author Fabien Potencier <fabien@symfony.com>
3132
* @author Jeremy Mikola <jmikola@gmail.com>
33+
* @author Kévin Dunglas <dunglas@gmail.com>
3234
*/
3335
class FrameworkExtension extends Extension
3436
{
@@ -121,11 +123,10 @@ public function load(array $configs, ContainerBuilder $container)
121123
}
122124

123125
$this->registerAnnotationsConfiguration($config['annotations'], $container, $loader);
124-
125126
$this->registerPropertyAccessConfiguration($config['property_access'], $container);
126127

127-
if (isset($config['serializer']) && $config['serializer']['enabled']) {
128-
$loader->load('serializer.xml');
128+
if (isset($config['serializer'])) {
129+
$this->registerSerializerConfiguration($config['serializer'], $container, $loader);
129130
}
130131

131132
$loader->load('debug_prod.xml');
@@ -866,6 +867,86 @@ private function registerSecurityCsrfConfiguration(array $config, ContainerBuild
866867
$loader->load('security_csrf.xml');
867868
}
868869

870+
/**
871+
* Loads the serializer configuration.
872+
*
873+
* @param array $config A serializer configuration array
874+
* @param ContainerBuilder $container A ContainerBuilder instance
875+
* @param XmlFileLoader $loader An XmlFileLoader instance
876+
*/
877+
private function registerSerializerConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
878+
{
879+
if (!$config['enabled']) {
880+
return;
881+
}
882+
883+
$loader->load('serializer.xml');
884+
$chainLoader = $container->getDefinition('serializer.mapping.chain_loader');
885+
886+
$serializerLoaders = array();
887+
if (isset($config['enable_annotations']) && $config['enable_annotations']) {
888+
$annotationLoader = new Definition(
889+
'Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader',
890+
array(new Reference('annotation_reader'))
891+
);
892+
$annotationLoader->setPublic(false);
893+
894+
$serializerLoaders[] = $annotationLoader;
895+
}
896+
897+
$bundles = $container->getParameter('kernel.bundles');
898+
foreach ($bundles as $bundle) {
899+
$reflection = new \ReflectionClass($bundle);
900+
$dirname = dirname($reflection->getFilename());
901+
902+
if (is_file($file = $dirname.'/Resources/config/serialization.xml')) {
903+
$definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader', array(realpath($file)));
904+
$definition->setPublic(false);
905+
906+
$serializerLoaders[] = $definition;
907+
$container->addResource(new FileResource($file));
908+
}
909+
910+
if (is_file($file = $dirname.'/Resources/config/serialization.yml')) {
911+
$definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader', array(realpath($file)));
912+
$definition->setPublic(false);
913+
914+
$serializerLoaders[] = $definition;
915+
$container->addResource(new FileResource($file));
916+
}
917+
918+
if (is_dir($dir = $dirname.'/Resources/config/serialization')) {
919+
foreach (Finder::create()->files()->in($dir)->name('*.xml') as $file) {
920+
$definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader', array($file->getRealpath()));
921+
$definition->setPublic(false);
922+
923+
$serializerLoaders[] = $definition;
924+
}
925+
foreach (Finder::create()->files()->in($dir)->name('*.yml') as $file) {
926+
$definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader', array($file->getRealpath()));
927+
$definition->setPublic(false);
928+
929+
$serializerLoaders[] = $definition;
930+
}
931+
932+
$container->addResource(new DirectoryResource($dir));
933+
}
934+
}
935+
936+
$chainLoader->replaceArgument(0, $serializerLoaders);
937+
938+
if (isset($config['cache']) && $config['cache']) {
939+
$container->setParameter(
940+
'serializer.mapping.cache.prefix',
941+
'serializer_'.hash('sha256', $container->getParameter('kernel.root_dir'))
942+
);
943+
944+
$container->getDefinition('serializer.mapping.class_metadata_factory')->replaceArgument(
945+
1, new Reference($config['cache'])
946+
);
947+
}
948+
}
949+
869950
/**
870951
* Returns the base path for the XSD files.
871952
*

Resources/config/schema/symfony-1.0.xsd

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
<xsd:element name="validation" type="validation" minOccurs="0" maxOccurs="1" />
3333
<xsd:element name="annotations" type="annotations" minOccurs="0" maxOccurs="1" />
3434
<xsd:element name="property-access" type="property_access" minOccurs="0" maxOccurs="1" />
35+
<xsd:element name="serializer" type="serializer" minOccurs="0" maxOccurs="1" />
3536
</xsd:all>
3637

3738
<xsd:attribute name="http-method-override" type="xsd:boolean" />
@@ -210,4 +211,10 @@
210211
<xsd:attribute name="magic-call" type="xsd:boolean" />
211212
<xsd:attribute name="throw-exception-on-invalid-index" type="xsd:boolean" />
212213
</xsd:complexType>
214+
215+
<xsd:complexType name="serializer">
216+
<xsd:attribute name="enabled" type="xsd:boolean" />
217+
<xsd:attribute name="cache" type="xsd:string" />
218+
<xsd:attribute name="enable-annotations" type="xsd:boolean" />
219+
</xsd:complexType>
213220
</xsd:schema>

Resources/config/serializer.xml

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,31 @@
1717
</service>
1818

1919
<!-- Normalizer -->
20-
<service id="serializer.normalizer.get_set_method" class="Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer" public="false">
20+
<service id="serializer.normalizer.object" class="Symfony\Component\Serializer\Normalizer\ObjectNormalizer" public="false">
21+
<argument type="service" id="serializer.mapping.class_metadata_factory" />
22+
2123
<!-- Run after all custom serializers -->
2224
<tag name="serializer.normalizer" priority="-1000" />
2325
</service>
2426

27+
<!-- Loader -->
28+
<service id="serializer.mapping.chain_loader" class="Symfony\Component\Serializer\Mapping\Loader\LoaderChain" public="false">
29+
<argument type="collection" />
30+
</service>
31+
32+
<!-- Class Metadata Factory -->
33+
<service id="serializer.mapping.class_metadata_factory" class="Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory" public="false">
34+
<argument type="service" id="serializer.mapping.chain_loader" />
35+
<argument>null</argument>
36+
</service>
37+
38+
<!-- Cache -->
39+
<service id="serializer.mapping.cache.apc" class="Doctrine\Common\Cache\ApcCache" public="false">
40+
<call method="setNamespace">
41+
<argument>%serializer.mapping.cache.prefix%</argument>
42+
</call>
43+
</service>
44+
2545
<!-- Encoders -->
2646
<service id="serializer.encoder.xml" class="%serializer.encoder.xml.class%" public="false" >
2747
<tag name="serializer.encoder" />

Tests/DependencyInjection/ConfigurationTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ protected static function getBundleDefaultConfig()
161161
),
162162
'serializer' => array(
163163
'enabled' => false,
164+
'enable_annotations' => false,
164165
),
165166
'property_access' => array(
166167
'magic_call' => false,

Tests/DependencyInjection/Fixtures/php/full.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
'debug' => true,
6161
'file_cache_dir' => '%kernel.cache_dir%/annotations',
6262
),
63+
'serializer' => array('enabled' => true),
6364
'ide' => 'file%%link%%format',
6465
'request' => array(
6566
'formats' => array(

Tests/DependencyInjection/Fixtures/xml/full.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,6 @@
3737
<framework:translator enabled="true" fallback="fr" logging="true" />
3838
<framework:validation enabled="true" cache="apc" />
3939
<framework:annotations cache="file" debug="true" file-cache-dir="%kernel.cache_dir%/annotations" />
40+
<framework:serializer enabled="true" />
4041
</framework:config>
4142
</container>

Tests/DependencyInjection/Fixtures/yml/full.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ framework:
4646
cache: file
4747
debug: true
4848
file_cache_dir: %kernel.cache_dir%/annotations
49+
serializer: { enabled: true }
4950
ide: file%%link%%format
5051
request:
5152
formats:

Tests/DependencyInjection/FrameworkExtensionTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,18 @@ public function testStopwatchEnabledWithDebugModeDisabled()
498498
$this->assertTrue($container->has('debug.stopwatch'));
499499
}
500500

501+
public function testSerializerDisabled()
502+
{
503+
$container = $this->createContainerFromFile('default_config');
504+
$this->assertFalse($container->has('serializer'));
505+
}
506+
507+
public function testSerializerEnabled()
508+
{
509+
$container = $this->createContainerFromFile('full');
510+
$this->assertTrue($container->has('serializer'));
511+
}
512+
501513
protected function createContainer(array $data = array())
502514
{
503515
return new ContainerBuilder(new ParameterBag(array_merge(array(

0 commit comments

Comments
 (0)