8000 [FrameworkBundle] Serializer groups support · symfony/symfony@4ecb81e · GitHub
[go: up one dir, main page]

Skip to content

Commit 4ecb81e

Browse files
committed
[FrameworkBundle] Serializer groups support
1 parent 64d6ddb commit 4ecb81e

File tree

9 files changed

+115
-4
lines changed

9 files changed

+115
-4
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
* FrameworkExtension configuration structure.
2020
*
2121
* @author Jeremy Mikola <jmikola@gmail.com>
22+
* @author Kévin Dunglas <dunglas@gmail.com>
2223
*/
2324
class Configuration implements ConfigurationInterface
2425
{
@@ -532,6 +533,10 @@ private function addSerializerSection(ArrayNodeDefinition $rootNode)
532533
->arrayNode('serializer')
533534
->info('serializer configuration')
534535
->canBeEnabled()
536+
->children()
537+
->booleanNode('enable_annotations')->defaultFalse()->end()
538+
->scalarNode('cache')->end()
539+
->end()
535540
->end()
536541
->end()
537542
;

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 74 additions & 4 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
{
@@ -116,11 +118,10 @@ public function load(array $configs, ContainerBuilder $container)
116118
}
117119

118120
$this->registerAnnotationsConfiguration($config['annotations'], $container, $loader);
119-
120121
$this->registerPropertyAccessConfiguration($config['property_access'], $container);
121122

122-
if (isset($config['serializer']) && $config['serializer']['enabled']) {
123-
$loader->load('serializer.xml');
123+
if (isset($config['serializer'])) {
124+
$this->registerSerializerConfiguration($config['serializer'], $container, $loader);
124125
}
125126

126127
$loader->load('debug_prod.xml');
@@ -298,7 +299,7 @@ private function registerProfilerConfiguration(array $config, ContainerBuilder $
298299
'memcached' => 'Symfony\Component\HttpKernel\Profiler\MemcachedProfilerStorage',
299300
'redis' => 'Symfony\Component\HttpKernel\Profiler\RedisProfilerStorage',
300301
);
301-
list($class,) = explode(':', $config['dsn'], 2);
302+
list($class) = explode(':', $config['dsn'], 2);
302303
if (! A3E2 isset($supported[$class])) {
303304
throw new \LogicException(sprintf('Driver "%s" is not supported for the profiler.', $class));
304305
}
@@ -860,6 +861,75 @@ private function registerSecurityCsrfConfiguration(array $config, ContainerBuild
860861
$loader->load('security_csrf.xml');
861862
}
862863

864+
/**
865+
* Loads the serializer configuration.
866+
*
867+
* @param array $config A serializer configuration array
868+
* @param ContainerBuilder $container A ContainerBuilder instance
869+
* @param XmlFileLoader $loader An XmlFileLoader instance
870+
*/
871+
private function registerSerializerConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
872+
{
873+
if (!$config['enabled']) {
874+
return;
875+
}
876+
877+
$loader->load('serializer.xml');
878+
$chainLoader = $container->getDefinition('serializer.mapping.chain_loader');
879+
880+
$serializerLoaders = array();
881+
if (isset($config['enable_annotations']) && $config['enable_annotations']) {
882+
$annotationLoader = new Definition(
883+
'Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader',
884+
array(new Reference('annotation_reader'))
885+
);
886+
$annotationLoader->setPublic(false);
887+
888+
$serializerLoaders[] = $annotationLoader;
889+
}
890+
891+
$bundles = $container->getParameter('kernel.bundles');
892+
foreach ($bundles as $bundle) {
893+
$reflection = new \ReflectionClass($bundle);
894+
$dirname = dirname($reflection->getFilename());
895+
896+
if (is_file($file = $dirname.'/Resources/config/serialization.xml')) {
897+
$definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader', array(realpath($file)));
898+
$definition->setPublic(false);
899+
900+
$serializerLoaders[] = $definition;
901+
$container->addResource(new FileResource($file));
902+
}
903+
904+
if (is_file($file = $dirname.'/Resources/config/serialization.yml')) {
905+
$definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader', array(realpath($file)));
906+
$definition->setPublic(false);
907+
908+
$serializerLoaders[] = $definition;
909+
$container->addResource(new FileResource($file));
910+
}
911+
}
912+
913+
$chainLoader->replaceArgument(0, $serializerLoaders);
914+
915+
if (isset($config['cache']) && $config['cache'] !== 'none') {
916+
$container->setParameter(
917+
'serializer.mapping.cache.prefix',
918+
'serializer_'.hash('sha256', $container->getParameter('kernel.root_dir'))
919+
);
920+
921+
if ($config['cache'] === 'apc') {
922+
$apcCacheDefinition = $container->register('serializer.mapping.cache.apc', 'Doctrine\Common\Cache\ApcCache');
923+
$apcCacheDefinition->addMethodCall('setNamespace', array('%serializer.mapping.cache.prefix%'));
924+
$apcCacheDefinition->setPublic(false);
925+
}
926+
927+
$container->getDefinition('serializer.mapping.class_metadata_factory')->replaceArgument(
928+
1, new Reference('serializer.mapping.cache.'.$config['cache'])
929+
);
930+
}
931+
}
932+
863933
/**
864934
* Returns the base path for the XSD files.
865935
*

src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd

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

3637
<xsd:attribute name="http-method-override" type="xsd:boolean" />
@@ -183,4 +184,10 @@
183184
<xsd:attribute name="magic-call" type="xsd:boolean" />
184185
<xsd:attribute name="throw-exception-on-invalid-index" type="xsd:boolean" />
185186
</xsd:complexType>
187+
188+
<xsd:complexType name="serializer">
189+
<xsd:attribute name="enabled" type="xsd:boolean" />
190+
<xsd:attribute name="cache" type="xsd:string" />
191+
<xsd:attribute name="enable-annotations" type="xsd:boolean" />
192+
</xsd:complexType>
186193
</xsd:schema>

src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,23 @@
1818

1919
<!-- Normalizer -->
2020
<service id="serializer.normalizer.get_set_method" class="Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer" 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+
2538
<!-- Encoders -->
2639
<service id="serializer.encoder.xml" class="%serializer.encoder.xml.class%" public="false" >
2740
<tag name="serializer.encoder" />

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ protected static function getBundleDefaultConfig()
140140
),
141141
'serializer' => array(
142142
'enabled' => false,
143+
'enable_annotations' => false,
143144
),
144145
'property_access' => array(
145146
'magic_call' => false,

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/full.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
'debug' => true,
7272
'file_cache_dir' => '%kernel.cache_dir%/annotations',
7373
),
74+
'serializer' => array('enabled' => true),
7475
'ide' => 'file%%link%%format',
7576
'request' => array(
7677
'formats' => array(

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/full.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,6 @@
4545
<framework:translator enabled="true" fallback="fr" />
4646
<framework:validation enabled="true" cache="apc" />
4747
<framework:annotations cache="file" debug="true" file-cache-dir="%kernel.cache_dir%/annotations" />
48+
<framework:serializer enabled="true" />
4849
</framework:config>
4950
</container>

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/full.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ framework:
5555
cache: file
5656
debug: true
5757
file_cache_dir: %kernel.cache_dir%/annotations
58+
serializer: { enabled: true }
5859
ide: file%%link%%format
5960
request:
6061
formats:

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php

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

524+
public function testSerializerDisabled()
525+
{
526+
$container = $this->createContainerFromFile('default_config');
527+
$this->assertFalse($container->has('serializer'));
528+
}
529+
530+
public function testSerializerEnabled()
531+
{
532+
$container = $this->createContainerFromFile('full');
533+
$this->assertTrue($container->has('serializer'));
534+
}
535+
524536
protected function createContainer(array $data = array())
525537
{
526538
return new ContainerBuilder(new ParameterBag(array_merge(array(

0 commit comments

Comments
 (0)
0