8000 [Serializer] Fix a deprecation triggered by the ClassMetadataFactory · symfony/symfony@406b5a8 · GitHub
[go: up one dir, main page]

Skip to content

Commit 406b5a8

Browse files
committed
[Serializer] Fix a deprecation triggered by the ClassMetadataFactory
1 parent db208e3 commit 406b5a8

File tree

9 files changed

+136
-11
lines changed

9 files changed

+136
-11
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
13+
14+
use Psr\Cache\CacheItemPoolInterface;
15+
use Symfony\Component\DependencyInjection\ContainerBuilder;
16+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
17+
use Symfony\Component\DependencyInjection\Definition;
18+
use Symfony\Component\DependencyInjection\Reference;
19+
use Symfony\Component\Serializer\Mapping\Factory\CacheClassMetadataFactory;
20+
21+
/**
22+
* Adds all services with the tags "serializer.encoder" and "serializer.normalizer" as
23+
* encoders and normalizers to the Serializer service.
24+
*
25+
* @author Guilhem N. <egetick@gmail.com>
26+
*/
27+
class SerializerCachePass implements CompilerPassInterface
28+
{
29+
public function process(ContainerBuilder $container)
30+
{
31+
if (!$container->hasAlias('serializer.mapping.cache') && !$container->hasDefinition('serializer.mapping.cache')) {
32+
return;
33+
}
34+
35+
$cacheClass = $container->getParameterBag()->resolveValue(
36+
$container->findDefinition('serializer.mapping.cache')->getClass()
37+
);
38+
39+
if (is_a($cacheClass, CacheItemPoolInterface::class, true)) {
40+
$metadataFactory = new Definition(CacheClassMetadataFactory::class, [
41+
new Reference('serializer.mapping.class_metadata_factory.inner'),
42+
new Reference('serializer.mapping.cache'),
43+
]);
44+
$metadataFactory->setPublic(false);
45+
$metadataFactory->setDecoratedService('serializer.mapping.class_metadata_factory');
46+
47+
$container->setDefinition('serializer.mapping.cache_class_metadata_factory', $metadataFactory);
48+
} else {
49+
$container->getDefinition('serializer.mapping.class_metadata_factory')->replaceArgument(
50+
1, new Reference('serializer.mapping.cache')
51+
);
52+
}
53+
}
54+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,7 @@ private function addSerializerSection(ArrayNodeDefinition $rootNode)
513513
->canBeEnabled()
514514
->children()
515515
->booleanNode('enable_annotations')->defaultFalse()->end()
516-
->scalarNode('cache')->defaultValue('serializer.mapping.cache.symfony')->end()
516+
->scalarNode('cache')->defaultValue('cache.pool.serializer')->end()
517517
->scalarNode('name_converter')->end()
518518
->end()
519519
->end()

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Bundle\FrameworkBundle\DependencyInjection;
1313

1414
use Doctrine\Common\Annotations\Reader;
15+
use Symfony\Component\DependencyInjection\Alias;
1516
use Symfony\Component\DependencyInjection\ContainerBuilder;
1617
use Symfony\Component\DependencyInjection\ContainerInterface;
1718
use Symfony\Component\DependencyInjection\Definition;
@@ -988,9 +989,7 @@ private function registerSerializerConfiguration(array $config, ContainerBuilder
988989
'serializer_'.$this->getKernelRootHash($container)
989990
);
990991

991-
$container->getDefinition('serializer.mapping.class_metadata_factory')->replaceArgument(
992-
1, new Reference($config['cache'])
993-
);
992+
$container->setAlias('serializer.mapping.cache', new Alias($config['cache'], false));
994993
}
995994

996995
if (isset($config['name_converter']) && $config['name_converter']) {

src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\CompilerDebugDumpPass;
3131
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TranslationExtractorPass;
3232
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TranslationDumperPass;
33+
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\SerializerCachePass;
3334
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\SerializerPass;
3435
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\UnusedTagsPass;
3536
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\ConfigCachePass;
@@ -87,6 +88,7 @@ public function build(ContainerBuilder $container)
8788
$container->addCompilerPass(new TranslationExtractorPass());
8889
$container->addCompilerPass(new TranslationDumperPass());
8990
$container->addCompilerPass(new FragmentRendererPass(), PassConfig::TYPE_AFTER_REMOVING);
91+
$container->addCompilerPass(new SerializerCachePass());
9092
$container->addCompilerPass(new SerializerPass());
9193
$container->addCompilerPass(new PropertyInfoPass());
9294
$container->addCompilerPass(new ControllerArgumentValueResolverPass());

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,6 @@
3838
</service>
3939

4040
<!-- Cache -->
41-
<service id="serializer.mapping.cache.symfony" class="Symfony\Component\Cache\DoctrineProvider" public="false">
42-
<argument type="service" id="cache.pool.serializer" />
43-
</service>
44-
4541
<service id="serializer.mapping.cache.doctrine.apc" class="Doctrine\Common\Cache\ApcCache" public="false">
4642
<call method="setNamespace">
4743
<argument>%serializer.mapping.cache.prefix%</argument>
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\Compiler;
13+
14+
use Doctrine\Common\Cache\CacheProvider;
15+
use Psr\Cache\CacheItemPoolInterface;
16+
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\SerializerCachePass;
17+
use Symfony\Component\Cache\Adapter\AbstractAdapter;
18+
use Symfony\Component\DependencyInjection\Definition;
19+
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
20+
use Symfony\Component\DependencyInjection\Reference;
21+
use Symfony\Component\DependencyInjection\ContainerBuilder;
22+
23+
/**
24+
* @author Guilhem N. <egetick@gmail.com>
25+
*/
26+
class SerializerCachePassTest extends \PHPUnit_Framework_T 1C6A estCase
27+
{
28+
private $pass;
29+
30+
/**
F438
31+
* @dataProvider psrClassProvider
32+
*/
33+
public function testPsrCacheItemPool($cacheClass)
34+
{
35+
$container = new ContainerBuilder(new ParameterBag(array(
36+
'cache.class' => $cacheClass,
37+
)));
38+
$container->setDefinition('serializer.mapping.cache', new Definition('%cache.class%'));
39+
40+
$this->pass->process($container);
41+
42+
$this->assertTrue($container->hasDefinition('serializer.mapping.cache_class_metadata_factory'));
43+
}
44+
45+
public function psrClassProvider()
46+
{
47+
return array(
48+
array(CacheItemPoolInterface::class),
49+
array(AbstractAdapter::class),
50+
);
51+
}
52+
53+
public function testDoctrineCache()
54+
{
55+
$container = new ContainerBuilder();
56+
57+
$container->setDefinition('serializer.mapping.class_metadata_factory', new Definition(null, array('foo', 'bar')));
58+
$container->setDefinition('cache', new Definition(CacheProvider::class));
59+
$container->setAlias('serializer.mapping.cache', 'cache');
60+
61+
$this->pass->process($container);
62+
63+
$this->assertFalse($container->hasDefinition('serializer.mapping.cache_class_metadata_factory'));
64+
$this->assertEquals(
65+
new Reference('serializer.mapping.cache'),
66+
$container->getDefinition('serializer.mapping.class_metadata_factory')->getArgument(1)
67+
);
68+
}
69+
70+
protected function setUp()
71+
{
72+
$this->pass = new SerializerCachePass();
73+
}
74+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ protected static function getBundleDefaultConfig()
221221
'serializer' => array(
222222
'enabled' => false,
223223
'enable_annotations' => false,
224-
'cache' => 'serializer.mapping.cache.symfony',
224+
'cache' => 'cache.pool.serializer',
225225
),
226226
'property_access' => array(
227227
'magic_call' => false,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ public function testSerializerEnabled()
449449

450450
$this->assertCount(1, $argument);
451451
$this->assertEquals('Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader', $argument[0]->getClass());
452-
$this->assertEquals(new Reference('serializer.mapping.cache.doctrine.apc'), $container->getDefinition('serializer.mapping.class_metadata_factory')->getArgument(1));
452+
$this->assertEquals('serializer.mapping.cache.doctrine.apc', (string) $container->getAlias('serializer.mapping.cache'));
453453
$this->assertEquals(new Reference('serializer.name_converter.camel_case_to_snake_case'), $container->getDefinition('serializer.normalizer.object')->getArgument(1));
454454
}
455455

src/Symfony/Bundle/FrameworkBundle/composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
"symfony/form": "~2.8|~3.0",
4848
"symfony/expression-language": "~2.8|~3.0",
4949
"symfony/process": "~2.8|~3.0",
50-
"symfony/serializer": "~2.8|^3.0",
50+
"symfony/serializer": "^3.1",
5151
"symfony/validator": "~3.1",
5252
"symfony/yaml": "~2.8|~3.0",
5353
"symfony/property-info": "~2.8|~3.0",

0 commit comments

Comments
 (0)
0