Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8f3eef5

Browse files
committed
[FrameworkBundle] Allow configuring serializer mapping paths
1 parent d236af6 commit 8f3eef5

File tree

15 files changed

+112
-38
lines changed

15 files changed

+112
-38
lines changed

src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ CHANGELOG
3030
* Deprecated `ControllerArgumentValueResolverPass`. Use
3131
`Symfony\Component\HttpKernel\DependencyInjection\ControllerArgumentValueResolverPass` instead
3232
* Deprecated `RoutingResolverPass`, use `Symfony\Component\Routing\DependencyInjection\RoutingResolverPass` instead
33+
* Added `framework.serializer.mapping` config option allowing to define custom
34+
serialization mapping files and directories
3335

3436
3.2.0
3537
-----

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,15 @@ private function addSerializerSection(ArrayNodeDefinition $rootNode)
678678
->booleanNode('enable_annotations')->{!class_exists(FullStack::class) && class_exists(Annotation::class) ? 'defaultTrue' : 'defaultFalse'}()->end()
679679
->scalarNode('cache')->end()
680680
->scalarNode('name_converter')->end()
681+
->arrayNode('mapping')
682+
->addDefaultsIfNotSet()
683+
->fixXmlConfig('path')
684+
->children()
685+
->arrayNode('paths')
686+
->prototype('scalar')->end()
687+
->end()
688+
->end()
689+
->end()
681690
->end()
682691
->end()
683692
->end()

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

Lines changed: 29 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -937,8 +937,7 @@ private function registerValidationConfiguration(array $config, ContainerBuilder
937937
$container->setParameter('validator.translation_domain', $config['translation_domain']);
938938

939939
$files = array('xml' => array(), 'yml' => array());
940-
$this->getValidatorMappingFiles($container, $files);
941-
$this->getValidatorMappingFilesFromConfig($config, $files);
940+
$this->registerValidatorMapping($container, $config, $files);
942941

943942
if (!empty($files['xml'])) {
944943
$validatorBuilder->addMethodCall('addXmlMappings', array($files['xml']));
@@ -979,50 +978,53 @@ private function registerValidationConfiguration(array $config, ContainerBuilder
979978
}
980979
}
981980

982-
private function getValidatorMappingFiles(ContainerBuilder $container, array &$files)
981+
private function registerValidatorMapping(ContainerBuilder $container, array $config, array &$files)
983982
{
983+
$fileRecorder = function ($extension, $path) use (&$files) {
984+
$files['yaml' === $extension ? 'yml' : $extension][] = $path;
985+
};
986+
984987
if (interface_exists('Symfony\Component\Form\FormInterface')) {
985988
$reflClass = new \ReflectionClass('Symfony\Component\Form\FormInterface');
986-
$files['xml'][] = dirname($reflClass->getFileName()).'/Resources/config/validation.xml';
989+
$fileRecorder('xml', dirname($reflClass->getFileName()).'/Resources/config/validation.xml');
987990
}
988991

989992
foreach ($container->getParameter('kernel.bundles_metadata') as $bundle) {
990993
$dirname = $bundle['path'];
991994

992995
if ($container->fileExists($file = $dirname.'/Resources/config/validation.yml', false)) {
993-
$files['yml'][] = $file;
996+
$fileRecorder('yml', $file);
994997
}
995998

996999
if ($container->fileExists($file = $dirname.'/Resources/config/validation.xml', false)) {
997-
$files['xml'][] = $file;
1000+
$fileRecorder('xml', $file);
9981001
}
9991002

10001003
if ($container->fileExists($dir = $dirname.'/Resources/config/validation')) {
1001-
$this->getValidatorMappingFilesFromDir($dir, $files);
1004+
$this->registerMappingFilesFromDir($dir, $fileRecorder);
10021005
}
10031006
}
1007+
1008+
$this->registerMappingFilesFromConfig($config, $fileRecorder);
10041009
}
10051010

1006-
private function getValidatorMappingFilesFromDir($dir, array &$files)
1011+
private function registerMappingFilesFromDir($dir, callable $fileRecorder)
10071012
{
10081013
foreach (Finder::create()->followLinks()->files()->in($dir)->name('/\.(xml|ya?ml)$/') as $file) {
1009-
$extension = $file->getExtension();
1010-
$files['yaml' === $extension ? 'yml' : $extension][] = $file->getRealpath();
1014+
$fileRecorder($file->getExtension(), $file->getRealPath());
10111015
}
10121016
}
10131017

1014-
private function getValidatorMappingFilesFromConfig(array $config, array &$files)
1018+
private function registerMappingFilesFromConfig(array $config, callable $fileRecorder)
10151019
{
10161020
foreach ($config['mapping']['paths'] as $path) {
10171021
if (is_dir($path)) {
1018-
$this->getValidatorMappingFilesFromDir($path, $files);
1022+
$this->registerMappingFilesFromDir($path, $fileRecorder);
10191023
} elseif (is_file($path)) {
1020-
if (preg_match('/\.(xml|ya?ml)$/', $path, $matches)) {
1021-
$extension = $matches[1];
1022-
$files['yaml' === $extension ? 'yml' : $extension][] = $path;
1023-
} else {
1024+
if (!preg_match('/\.(xml|ya?ml)$/', $path, $matches)) {
10241025
throw new \RuntimeException(sprintf('Unsupported mapping type in "%s", supported types are XML & Yaml.', $path));
10251026
}
1027+
$fileRecorder($matches[1], $path);
10261028
} else {
10271029
throw new \RuntimeException(sprintf('Could not open file or directory "%s".', $path));
10281030
}
@@ -1180,39 +1182,30 @@ private function registerSerializerConfiguration(array $config, ContainerBuilder
11801182
$serializerLoaders[] = $annotationLoader;
11811183
}
11821184

1185+
$fileRecorder = function ($extension, $path) use (&$serializerLoaders) {
1186+
$definition = new Definition(in_array($extension, array('yaml', 'yml')) ? 'Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader' : 'Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader', array($path));
1187+
$definition->setPublic(false);
1188+
$serializerLoaders[] = $definition;
1189+
};
1190+
11831191
foreach ($container->getParameter('kernel.bundles_metadata') as $bundle) {
11841192
$dirname = $bundle['path'];
11851193

11861194
if ($container->fileExists($file = $dirname.'/Resources/config/serialization.xml', false)) {
1187-
$definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader', array($file));
1188-
$definition->setPublic(false);
1189-
1190-
$serializerLoaders[] = $definition;
1195+
$fileRecorder('xml', $file);
11911196
}
11921197

11931198
if ($container->fileExists($file = $dirname.'/Resources/config/serialization.yml', false)) {
1194-
$definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader', array($file));
1195-
$definition->setPublic(false);
1196-
1197-
$serializerLoaders[] = $definition;
1199+
$fileRecorder('yml', $file);
11981200
}
11991201

12001202
if ($container->fileExists($dir = $dirname.'/Resources/config/serialization')) {
1201-
foreach (Finder::create()->followLinks()->files()->in($dir)->name('*.xml') as $file) {
1202-
$definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader', array($file->getPathname()));
1203-
$definition->setPublic(false);
1204-
1205-
$serializerLoaders[] = $definition;
1206-
}
1207-
foreach (Finder::create()->followLinks()->files()->in($dir)->name('*.yml') as $file) {
1208-
$definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader', array($file->getPathname()));
1209-
$definition->setPublic(false);
1210-
1211-
$serializerLoaders[] = $definition;
1212-
}
1203+
$this->registerMappingFilesFromDir($dir, $fileRecorder);
12131204
}
12141205
}
12151206

1207+
$this->registerMappingFilesFromConfig($config, $fileRecorder);
1208+
12161209
$chainLoader->replaceArgument(0, $serializerLoaders);
12171210
$container->getDefinition('serializer.mapping.cache_warmer')->replaceArgument(0, $serializerLoaders);
12181211

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@
176176
<xsd:complexType name="validation">
177177
<xsd:choice minOccurs="0" maxOccurs="unbounded">
178178
<xsd:element name="static-method" type="xsd:string" />
179-
<xsd:element name="mapping" type="validation_mapping" />
179+
<xsd:element name="mapping" type="file_mapping" />
180180
</xsd:choice>
181181

182182
<xsd:attribute name="enabled" type="xsd:boolean" />
@@ -185,7 +185,7 @@
185185
<xsd:attribute name="static-method" type="xsd:boolean" />
186186
</xsd:complexType>
187187

188-
<xsd:complexType name="validation_mapping">
188+
<xsd:complexType name="file_mapping">
189189
<xsd:sequence>
190190
<xsd:element name="path" type="xsd:string" minOccurs="1" maxOccurs="unbounded" />
191191
</xsd:sequence>
@@ -204,6 +204,9 @@
204204
</xsd:complexType>
205205

206206
<xsd:complexType name="serializer">
207+
<xsd:choice minOccurs="0" maxOccurs="unbounded">
208+
<xsd:element name="mapping" type="file_mapping" />
209+
</xsd:choice>
207210
<xsd:attribute name="enabled" type="xsd:boolean" />
208211
<xsd:attribute name="cache" type="xsd:string" />
209212
<xsd:attribute name="enable-annotations" type="xsd:boolean" />

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ protected static function getBundleDefaultConfig()
226226
'serializer' => array(
227227
'enabled' => !class_exists(FullStack::class),
228228
'enable_annotations' => !class_exists(FullStack::class),
229+
'mapping' => array('paths' => array()),
229230
),
230231
'property_access' => array(
231232
'magic_call' => false,

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/TestBundle/Resources/config/serialization.xml

Whitespace-only changes.

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/TestBundle/Resources/config/serialization.yml

Whitespace-only changes.

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/TestBundle/Resources/config/serializer_mapping/files/foo.xml

Whitespace-only changes.

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/TestBundle/Resources/config/serializer_mapping/files/foo.yml

Whitespace-only changes.

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/TestBundle/Resources/config/serializer_mapping/serialization.yaml

Whitespace-only changes.

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/TestBundle/Resources/config/serializer_mapping/serialization.yml

Whitespace-only changes.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
$container->loadFromExtension('framework', array(
4+
'annotations' => array('enabled' => true),
5+
'serializer' => array(
6+
'enable_annotations' => true,
7+
'mapping' => array(
8+
'paths' => array(
9+
'%kernel.root_dir%/Fixtures/TestBundle/Resources/config/serializer_mapping/files',
10+
'%kernel.root_dir%/Fixtures/TestBundle/Resources/config/serializer_mapping/serialization.yml',
11+
'%kernel.root_dir%/Fixtures/TestBundle/Resources/config/serializer_mapping/serialization.yaml',
12+
),
13+
),
14+
),
15+
));
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" ?>
2+
3+
<container xmlns="http://symfony.com/schema/dic/services"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xmlns:framework="http://symfony.com/schema/dic/symfony">
6+
7+
<framework:config>
8+
<framework:annotations enabled="true" />
9+
<framework:serializer enable-annotations="true">
10+
<framework:mapping>
11+
<framework:path>%kernel.root_dir%/Fixtures/TestBundle/Resources/config/serializer_mapping/files</framework:path>
12+
<framework:path>%kernel.root_dir%/Fixtures/TestBundle/Resources/config/serializer_mapping/serialization.yml</framework:path>
13+
<framework:path>%kernel.root_dir%/Fixtures/TestBundle/Resources/config/serializer_mapping/serialization.yaml</framework:path>
14+
</framework:mapping>
15+
</framework:serializer>
16+
</framework:config>
17+
</container>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
framework:
2+
annotations:
3+
enabled: true
4+
serializer:
5+
enable_annotations: true
6+
mapping:
7+
paths:
8+
- "%kernel.root_dir%/Fixtures/TestBundle/Resources/config/serializer_mapping/files"
9+
- "%kernel.root_dir%/Fixtures/TestBundle/Resources/config/serializer_mapping/serialization.yml"
10+
- "%kernel.root_dir%/Fixtures/TestBundle/Resources/config/serializer_mapping/serialization.yaml"

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@
2424
use Symfony\Component\Cache\Adapter\RedisAdapter;
2525
use Symfony\Component\DependencyInjection\ChildDefinition;
2626
use Symfony\Component\DependencyInjection\ContainerBuilder;
27+
use Symfony\Component\DependencyInjection\Definition;
2728
use Symfony\Component\DependencyInjection\Loader\ClosureLoader;
2829
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
2930
use Symfony\Component\DependencyInjection\Reference;
31+
use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader;
3032
use Symfony\Component\Serializer\Serializer;
3133
use Symfony\Component\Serializer\Mapping\Factory\CacheClassMetadataFactory;
3234
use Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader;
@@ -755,6 +757,28 @@ public function testDeprecatedSerializerCacheOption()
755757
$this->assertEquals(new Reference('foo'), $cache);
756758
}
757759

760+
public function testSerializerMapping()
761+
{
762+
$container = $this->createContainerFromFile('serializer_mapping', array('kernel.bundles_metadata' => array('TestBundle' => array('namespace' => 'Symfony\\Bundle\\FrameworkBundle\\Tests', 'path' => __DIR__.'/Fixtures/TestBundle', 'parent' => null))));
763+
$configDir = __DIR__.'/Fixtures/TestBundle/Resources/config';
764+
$expectedLoaders = array(
765+
new Definition(AnnotationLoader::class, array(new Reference('annotation_reader'))),
766+
new Definition(XmlFileLoader::class, array($configDir.'/serialization.xml')),
767+
new Definition(YamlFileLoader::class, array($configDir.'/serialization.yml')),
768+
new Definition(XmlFileLoader::class, array($configDir.'/serializer_mapping/files/foo.xml')),
769+
new Definition(YamlFileLoader::class, array($configDir.'/serializer_mapping/files/foo.yml')),
770+
new Definition(YamlFileLoader::class, array($configDir.'/serializer_mapping/serialization.yml')),
771+
new Definition(YamlFileLoader::class, array($configDir.'/serializer_mapping/serialization.yaml')),
772+
);
773+
774+
foreach ($expectedLoaders as $definition) {
775+
$definition->setPublic(false);
776+
}
777+
778+
$loaders = $container->getDefinition('serializer.mapping.chain_loader')->getArgument(0);
779+
$this->assertEquals(sort($expectedLoaders), sort($loaders));
780+
}
781+
758782
public function testAssetHelperWhenAssetsAreEnabled()
759783
{
760784
$container = $this->createContainerFromFile('full');

0 commit comments

Comments
 (0)