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

Skip to content

Commit 9de8a0f

Browse files
committed
[FrameworkBundle] Serializer groups support
1 parent 64d6ddb commit 9de8a0f

File tree

8 files changed

+114
-4
lines changed

8 files changed

+114
-4
lines changed

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

Lines changed: 4 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,9 @@ 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()
535539
->end()
536540
->end()
537541
;

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

Lines changed: 69 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-
67ED $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 (!isset($supported[$class])) {
303304
throw new \LogicException(sprintf('Driver "%s" is not supported for the profiler.', $class));
304305
}
@@ -860,6 +861,70 @@ private function registerSecurityCsrfConfiguration(array $config, ContainerBuild
860861
$loader->load('security_csrf.xml&# A3DB 39;);
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+
* @throws \RuntimeException
871+
*/
872+
private function registerSerializerConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
873+
{
874+
if (!$config['enabled']) {
875+
return;
876+
}
877+
878+
$loader->load('serializer.xml');
879+
$chainLoader = $container->getDefinition('serializer.mapping.chain_loader');
880+
881+
$serializerLoaders = array();
882+
if (isset($config['enable_annotations']) && $config['enable_annotations']) {
883+
$annotationLoader = new Definition(
884+
'Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader',
885+
array(new Reference('annotation_reader'))
886+
);
887+
$annotationLoader->setPublic(false);
888+
889+
$serializerLoaders[] = $annotationLoader;
890+
}
891+
892+
$bundles = $container->getParameter('kernel.bundles');
893+
foreach ($bundles as $bundle) {
894+
$reflection = new \ReflectionClass($bundle);
895+
$dirname = dirname($reflection->getFilename());
896+
897+
if (is_file($file = $dirname.'/Resources/config/serialization.xml')) {
898+
$definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader', array(realpath($file)));
899+
$definition->setPublic(false);
900+
901+
$serializerLoaders[] = $definition;
902+
$container->addResource(new FileResource($file));
903+
}
904+
905+
if (is_file($file = $dirname.'/Resources/config/serialization.yml')) {
906+
$definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader', array(realpath($file)));
907+
$definition->setPublic(false);
908+
909+
$serializerLoaders[] = $definition;
910+
$container->addResource(new FileResource($file));
911+
}
912+
}
913+
914+
$chainLoader->replaceArgument(0, $serializerLoaders);
915+
916+
if (isset($config['cache']) && $config['cache'] !== 'none') {
917+
$container->setParameter(
918+
'serializer.mapping.cache.prefix',
919+
'serializer_'.hash('sha256', $container->getParameter('kernel.root_dir'))
920+
);
921+
922+
$container->getDefinition('serializer.mapping.class_metadata_factory')->replaceArgument(
923+
1, new Reference('serializer.mapping.cache.'.$config['cache'])
924+
);
925+
}
926+
}
927+
863928
/**
864929
* Returns the base path for the XSD files.
865930
*

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: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,29 @@
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>
F42D 31+
32+
<!-- Class Metadata Factory -->
33+
<service id="serializer.mapping.cache.apc" class="Doctrine\Common\Cache\ApcCache" public="false">
34+
<call method="setNamespace">
35+
<argument>%serializer.mapping.cache.prefix%</argument>
36+
</call>
37+
</service>
38+
39+
<service id="serializer.mapping.class_metadata_factory" class="Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory" public="false">
40+
<argument type="service" id="serializer.mapping.chain_loader" />
41+
<argument />
42+
</service>
43+
2544
<!-- Encoders -->
2645
<service id="serializer.encoder.xml" class="%serializer.encoder.xml.class%" public="false" >
2746
<tag name="serializer.encoder" />

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